@willbooster/wb 21.0.0 → 21.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -10,8 +10,8 @@ import e from"node:fs";import t from"node:path";import n from"fast-glob";import
|
|
|
10
10
|
*/
|
|
11
11
|
const L=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`)),Je=new Int32Array([1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648]),Ye=new Int32Array(50),Xe=new Int32Array(18),Ze=new TextEncoder;let R=new Uint8Array(4096),Qe=new Uint32Array(R.buffer);const $e=new Uint8Array(new Uint32Array([1]).buffer)[0]===1;function et(e){let t=e.length*3,n=R,r=Qe;if(n.length<t){let e=n.length*2;for(;e<t;)e*=2;n=new Uint8Array(e),r=new Uint32Array(n.buffer),e<=1048576&&(R=n,Qe=r)}let i=Ze.encodeInto(e,n).written,a=Ye;a.fill(0);let o=0;if($e){let e=0;for(;i-o>=72;){for(let t=0;t<18;t++)a[t]=a[t]^r[e+t];z(a),e+=18,o+=72}}else for(;i-o>=72;){for(let e=0;e<18;e++){let t=o+(e<<2);a[e]=a[e]^(n[t]|n[t+1]<<8|n[t+2]<<16|n[t+3]<<24)}z(a),o+=72}let s=Xe;s.fill(0);for(let e=o;e<i;e++){let t=e-o;s[t>>2]=s[t>>2]|n[e]<<((t&3)<<3)}let c=i-o;s[c>>2]=s[c>>2]|6<<((c&3)<<3),s[17]|=2147483648;for(let e=0;e<18;e++)a[e]=a[e]^s[e];z(a);let l=``;for(let e=0;e<16;e+=4){let t=a[e],n=a[e+1],r=a[e+2],i=a[e+3];l+=L[t&255]+L[t>>8&255]+L[t>>16&255]+L[t>>>24]+L[n&255]+L[n>>8&255]+L[n>>16&255]+L[n>>>24]+L[r&255]+L[r>>8&255]+L[r>>16&255]+L[r>>>24]+L[i&255]+L[i>>8&255]+L[i>>16&255]+L[i>>>24]}return l}function z(e){let t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,ee,te,M,ne,re,ie,ae,oe,se,ce,le,ue,de,fe,N,pe,me,he,ge,_e,ve,ye,be,xe,Se,Ce,we,Te,Ee,P,De,Oe,ke=e[0],Ae=e[1],je=e[2],Me=e[3],Ne=e[4],Pe=e[5],Fe=e[6],F=e[7],Ie=e[8],Le=e[9],Re=e[10],ze=e[11],Be=e[12],I=e[13],Ve=e[14],He=e[15],Ue=e[16],We=e[17],Ge=e[18],Ke=e[19],qe=e[20],L=e[21],Ye=e[22],Xe=e[23],Ze=e[24],R=e[25],Qe=e[26],$e=e[27],et=e[28],z=e[29],tt=e[30],nt=e[31],rt=e[32],it=e[33],at=e[34],ot=e[35],st=e[36],ct=e[37],lt=e[38],B=e[39],ut=e[40],V=e[41],H=e[42],U=e[43],dt=e[44],ft=e[45],pt=e[46],mt=e[47],ht=e[48],gt=e[49];for(r=0;r<48;r+=2)i=ke^Re^qe^tt^ut,a=Ae^ze^L^nt^V,o=je^Be^Ye^rt^H,s=Me^I^Xe^it^U,c=Ne^Ve^Ze^at^dt,l=Pe^He^R^ot^ft,u=Fe^Ue^Qe^st^pt,d=F^We^$e^ct^mt,f=Ie^Ge^et^lt^ht,p=Le^Ke^z^B^gt,t=f^(o<<1|s>>>31),n=p^(s<<1|o>>>31),ke^=t,Ae^=n,Re^=t,ze^=n,qe^=t,L^=n,tt^=t,nt^=n,ut^=t,V^=n,t=i^(c<<1|l>>>31),n=a^(l<<1|c>>>31),je^=t,Me^=n,Be^=t,I^=n,Ye^=t,Xe^=n,rt^=t,it^=n,H^=t,U^=n,t=o^(u<<1|d>>>31),n=s^(d<<1|u>>>31),Ne^=t,Pe^=n,Ve^=t,He^=n,Ze^=t,R^=n,at^=t,ot^=n,dt^=t,ft^=n,t=c^(f<<1|p>>>31),n=l^(p<<1|f>>>31),Fe^=t,F^=n,Ue^=t,We^=n,Qe^=t,$e^=n,st^=t,ct^=n,pt^=t,mt^=n,t=u^(i<<1|a>>>31),n=d^(a<<1|i>>>31),Ie^=t,Le^=n,Ge^=t,Ke^=n,et^=t,z^=n,lt^=t,B^=n,ht^=t,gt^=n,m=ke,h=Ae,N=ze<<4|Re>>>28,pe=Re<<4|ze>>>28,O=qe<<3|L>>>29,k=L<<3|qe>>>29,Ee=nt<<9|tt>>>23,P=tt<<9|nt>>>23,le=ut<<18|V>>>14,ue=V<<18|ut>>>14,M=je<<1|Me>>>31,ne=Me<<1|je>>>31,g=I<<12|Be>>>20,_=Be<<12|I>>>20,me=Ye<<10|Xe>>>22,he=Xe<<10|Ye>>>22,A=it<<13|rt>>>19,j=rt<<13|it>>>19,De=H<<2|U>>>30,Oe=U<<2|H>>>30,be=Pe<<30|Ne>>>2,xe=Ne<<30|Pe>>>2,re=Ve<<6|He>>>26,ie=He<<6|Ve>>>26,v=R<<11|Ze>>>21,y=Ze<<11|R>>>21,ge=at<<15|ot>>>17,_e=ot<<15|at>>>17,ee=ft<<29|dt>>>3,te=dt<<29|ft>>>3,w=Fe<<28|F>>>4,T=F<<28|Fe>>>4,Se=We<<23|Ue>>>9,Ce=Ue<<23|We>>>9,ae=Qe<<25|$e>>>7,oe=$e<<25|Qe>>>7,b=st<<21|ct>>>11,x=ct<<21|st>>>11,ve=mt<<24|pt>>>8,ye=pt<<24|mt>>>8,de=Ie<<27|Le>>>5,fe=Le<<27|Ie>>>5,E=Ge<<20|Ke>>>12,D=Ke<<20|Ge>>>12,we=z<<7|et>>>25,Te=et<<7|z>>>25,se=lt<<8|B>>>24,ce=B<<8|lt>>>24,S=ht<<14|gt>>>18,C=gt<<14|ht>>>18,ke=m^~g&v,Ae=h^~_&y,Re=w^~E&O,ze=T^~D&k,qe=M^~re&ae,L=ne^~ie&oe,tt=de^~N&me,nt=fe^~pe&he,ut=be^~Se&we,V=xe^~Ce&Te,je=g^~v&b,Me=_^~y&x,Be=E^~O&A,I=D^~k&j,Ye=re^~ae&se,Xe=ie^~oe&ce,rt=N^~me&ge,it=pe^~he&_e,H=Se^~we&Ee,U=Ce^~Te&P,Ne=v^~b&S,Pe=y^~x&C,Ve=O^~A&ee,He=k^~j&te,Ze=ae^~se&le,R=oe^~ce&ue,at=me^~ge&ve,ot=he^~_e&ye,dt=we^~Ee&De,ft=Te^~P&Oe,Fe=b^~S&m,F=x^~C&h,Ue=A^~ee&w,We=j^~te&T,Qe=se^~le&M,$e=ce^~ue&ne,st=ge^~ve&de,ct=_e^~ye&fe,pt=Ee^~De&be,mt=P^~Oe&xe,Ie=S^~m&g,Le=C^~h&_,Ge=ee^~w&E,Ke=te^~T&D,et=le^~M&re,z=ue^~ne&ie,lt=ve^~de&N,B=ye^~fe&pe,ht=De^~be&Se,gt=Oe^~xe&Ce,ke^=Je[r],Ae^=Je[r+1];e[0]=ke,e[1]=Ae,e[2]=je,e[3]=Me,e[4]=Ne,e[5]=Pe,e[6]=Fe,e[7]=F,e[8]=Ie,e[9]=Le,e[10]=Re,e[11]=ze,e[12]=Be,e[13]=I,e[14]=Ve,e[15]=He,e[16]=Ue,e[17]=We,e[18]=Ge,e[19]=Ke,e[20]=qe,e[21]=L,e[22]=Ye,e[23]=Xe,e[24]=Ze,e[25]=R,e[26]=Qe,e[27]=$e,e[28]=et,e[29]=z,e[30]=tt,e[31]=nt,e[32]=rt,e[33]=it,e[34]=at,e[35]=ot,e[36]=st,e[37]=ct,e[38]=lt,e[39]=B,e[40]=ut,e[41]=V,e[42]=H,e[43]=U,e[44]=dt,e[45]=ft,e[46]=pt,e[47]=mt,e[48]=ht,e[49]=gt}const tt=it(),nt=new TextEncoder,rt=new TextDecoder(`utf-8`);function it(){return new Map([{instance:Error,from:e=>{let t=[e.name,e.message];return e.stack!==void 0&&t.push(e.stack),e.cause!==void 0&&(e.stack===void 0&&t.push(void 0),t.push(e.cause)),t},stub:()=>Error(),hydrate:(e,[t,n,r,i])=>{e.name=t,e.message=n,r===void 0?delete e.stack:e.stack=r,i!==void 0&&(e.cause=i)}},{instance:Uint8Array,from:e=>[btoa(rt.decode(e))],create:([e])=>nt.encode(atob(e))},{instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(let[n,r]of t)e.set(n,r)}},{instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(let n of t)e.add(n)}},{instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},{instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},{instance:URL,from:e=>[e.href],create:([e])=>new URL(e)}].map(e=>[e.instance.name,e]))}function at(e,t=tt){return JSON.stringify(st(e,t))}function ot(e){if(e===void 0)return-1;if(typeof e==`number`){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}function st(e,t=tt){let n=ot(e);if(n!==null)return n;let r=[],i=new Map;return a(e),r;function a(e){let n=ot(e);if(n!==null)return n;let o=i.get(e);if(o!==void 0)return o;switch(o=r.length,typeof e){case`number`:case`string`:case`boolean`:r[o]=e,i.set(e,o);break;case`bigint`:r[o]=[-6,e.toString(16)],i.set(e,o);break;case`object`:if(e===null)r[o]=e,i.set(e,o);else if(Array.isArray(e)){let t=e.length,n=Array(t);r[o]=n,i.set(e,o);for(let r=0;r<t;r++)n[r]=a(e[r])}else{let n=e.constructor,s=typeof n==`function`?t.get(n.name):void 0;if(s===void 0){let t=Object.keys(e),n=t.length,s=Array(n+n+1);s[0]=``,r[o]=s,i.set(e,o);for(let r=0;r<n;r++){let n=t[r],i=r+r;s[i+1]=a(n),s[i+2]=a(e[n])}}else{let t=s.from(e),c=t.length,l=Array(c+1);l[0]=n.name,r[o]=l,i.set(e,o);for(let e=0;e<c;e++)l[e+1]=a(t[e])}}}return o}}function ct(e,t){return et(at([e,t]))}function lt(){return``}const B=ut({getCacheKey:ct});ut({getCacheKey:lt});function ut({cacheDuration:e=1/0,getCacheKey:t=ct}={}){return function(n,r){let i,a,o;return r?.kind===`getter`?function(){let r=t(this,[]),s=Date.now();return(o!==r||s-a>e)&&(o=r,i=n.call(this),a=s),i}:function(...s){let c=t(this,s),l=Date.now();return(o!==c||l-a>e)&&(o=c,i=Reflect.apply(n,r?this:void 0,s),a=l),i}}}function V(n,r){let i=[],a=t.resolve(n);for(;;){let n=t.join(a,`node_modules`,`.bin`);if(e.existsSync(n)&&i.push(n),e.existsSync(t.join(a,`.git`)))break;let r=t.dirname(a);if(a===r)break;a=r}return i.length===0?!1:(r.PATH=r.PATH?`${i.join(`:`)}:${r.PATH}`:i.join(`:`),!0)}function H(e){return dt(e)}function U(e){return dt(e.env.WB_DOCKER)}function dt(e){return!!e&&e!==`0`&&e!==`false`}function ft(e){return new Set(e.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e))}function pt(n){let r,i=!1;for(let a=t.resolve(n);;a=t.dirname(a)){let n=_t(t.join(a,`package.json`));if(n!==void 0&&(r=n),i||=mt(a),e.existsSync(t.join(a,`.git`))||t.dirname(a)===a)return ht(r)?!1:i||gt(r)}}function mt(n){return[`bun.lock`,`bun.lockb`].some(r=>e.existsSync(t.join(n,r)))||[`mise.toml`,`.mise.toml`].some(e=>vt(t.join(n,e),/^\s*(?:"bun"|bun)\s*=/m))||vt(t.join(n,`.tool-versions`),/(^|\n)bun\s/)}function ht(e){return typeof e==`string`&&!!e.trim()&&!gt(e)}function gt(e){return typeof e==`string`&&e.startsWith(`bun@`)}function _t(t){try{return JSON.parse(e.readFileSync(t,`utf8`)).packageManager}catch{return}}function vt(t,n){try{return n.test(e.readFileSync(t,`utf8`))}catch{return!1}}const yt=new Set([`unit`,`e2e`,`debug`,`helpers`,`fixtures`]),bt=new Set([`unit`,`e2e`,`debug`]),xt=/\.(?:test|spec)\.[cm]?[jt]sx?$/;function St(n){let r=t.join(n.dirPath,`test`),i=[...wt(n.dirPath)];return!n.packageJson.workspaces&&e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&!e.existsSync(t.join(r,`e2e`))&&i.push(`playwright.config.ts`),i}const Ct=new Map;function wt(n){let r=Ct.get(n);if(r)return r;let i=[],a=t.join(n,`test`);if(e.existsSync(a))for(let t of e.readdirSync(a,{withFileTypes:!0}))t.name.startsWith(`.`)||(!t.isDirectory()||!yt.has(t.name))&&i.push(`test/${t.name}`);Tt(n,``,i);let o=[...new Set(i)];return Ct.set(n,o),o}function Tt(n,r,i){for(let a of e.readdirSync(t.join(n,r),{withFileTypes:!0})){if(a.name.startsWith(`.`)||a.name===`node_modules`)continue;let o=r?`${r}/${a.name}`:a.name;if(a.isDirectory()){if(r===`test`&&(bt.has(a.name)||a.name===`fixtures`)||e.existsSync(t.join(n,o,`package.json`)))continue;Tt(n,o,i)}else xt.test(a.name)&&i.push(o)}}function Et(e,t){console.error(p.red(`Invalid test layout in ${e}. test/ may contain only the unit, e2e, debug, helpers, and fixtures directories, test files may exist only under test/unit/, test/e2e/, and test/debug/, and a Playwright config requires test/e2e/:\n`+t.map(e=>` ${e}`).join(`
|
|
12
12
|
`)))}function Dt(e){let t=!1;for(let n of e){let e=St(n);e.length!==0&&(Et(n.name,e),t=!0)}return t}const Ot={...le,"working-dir":{description:`A working directory`,type:`string`,alias:`w`},"dry-run":{description:`Whether to skip actual command execution`,type:`boolean`,alias:[`dry`,`d`]}};function kt(e){let t=[];for(let n of Object.keys(le)){let r=At(e,n);if(r!==void 0){if(typeof r==`boolean`){t.push(r?`--${n}`:`--${n}=false`);continue}if(typeof r==`string`||typeof r==`number`){t.push(`--${n}=${r}`);continue}if(Array.isArray(r))for(let e of r)t.push(`--${n}=${e}`)}}return e.silent===!0&&At(e,`quiet-env`)===void 0&&t.push(`--quiet-env`),t}function At(e,t){let n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}function W(e){return e.map(e=>G(e)).join(` `)}function jt(e,t){return`${e}=${G(t)}`}function G(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll(`'`,`'"'"'`)}'`}const Mt=[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`];function Nt(e,t){return W([`YARN`,`wb`,`gen-dev-vars`,...kt(e),t])}function Pt(e){return`env -u CLOUDFLARE_ENV YARN wrangler ${e}`.trim()}function Ft(e){let t=Lt(e);if(!(!t||!Bt(e)))return`CI=true YARN wrangler d1 migrations apply ${t} --local --persist-to "${Ut(e)}"`}function It(e,n){let r=Lt(e);if(!r)return n;let i=`export DATABASE_URL="file:$(ls "${t.resolve(e.dirPath,Ut(e))}"/v3/d1/miniflare-D1DatabaseObject/*.sqlite | grep -v metadata | head -1)"`;return`${Ht(e,r)} && ${i} && ${n}`}function Lt(e){let t=zt(e);if(t)return Vt(t,`database_name`)}const Rt=new WeakMap;function zt(n){if(!n.dirPath)return;let r=Rt.get(n);if(r)return r.configPath;let i=Mt.map(e=>t.join(n.dirPath,e)).find(t=>e.existsSync(t));return Rt.set(n,{configPath:i}),i}function Bt(n){let r=zt(n);if(!r)return;let i=t.join(n.dirPath,Vt(r,`migrations_dir`)??`migrations`);return e.existsSync(i)?i:void 0}function Vt(t,n){let r=RegExp(`(?:^|[,{])\\s*["']?${n}["']?\\s*[:=]\\s*["']([^"']+)["']`,`u`);for(let n of e.readFileSync(t,`utf8`).split(`
|
|
13
|
-
`)){if(/^\s*(?:#|\/\/)/u.test(n))continue;let e=r.exec(n);if(e)return e[1]}}function Ht(e,t){return`YARN wrangler d1 execute ${t} --local --persist-to "${Ut(e)}" --command "SELECT 1" > /dev/null`}function Ut(e){let t=[e.env.WB_ENV,e.env.MISE_ENV].includes(`test`)?`test`:e.env.WB_ENV||e.env.MISE_ENV;return!t||t===`development`?`.wrangler/state`:`.wrangler/state-${t}`}let Wt;function Gt(e,t,n,r,i,a){var o,s,c,l,u,d,f,p=Symbol.metadata||Symbol.for(`Symbol.metadata`),m=Object.defineProperty,h=Object.create,g=[h(null),h(null)],_=t.length;function v(t,n,r){return function(i,a){n&&(a=i,i=e);for(var o=0;o<t.length;o++)a=t[o].apply(i,r?[a]:[]);return r?a:i}}function y(e,t,n,r){if(typeof e!=`function`&&(r||e!==void 0))throw TypeError(t+` must `+(n||`be`)+` a function`+(r?``:` or undefined`));return e}function b(e,t,n,r,i,a,c,l,u,d,f){function p(e){if(!f(e))throw TypeError(`Attempted to access private element on non-instance`)}var h=[].concat(t[0]),_=t[3],b=!c,x=i===1,S=i===3,C=i===4,w=i===2;function T(t,n,r){return function(i,a){return n&&(a=i,i=e),r&&r(i),E[t].call(i,a)}}if(!b){var E={},D=[],O=S?`get`:C||x?`set`:`value`;if(u?(d||x?E={get:Jt(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||Jt(E[O],r,w?``:O)):d||(E=Object.getOwnPropertyDescriptor(e,r)),!d&&!u){if((s=g[+l][r])&&(s^i)!==7)throw Error(`Decorating two elements with the same name (`+E[O].name+`) is not supported yet`);g[+l][r]=i<3?1:i}}for(var k=e,A=h.length-1;A>=0;A-=n?2:1){var j=y(h[A],`A decorator`,`be`,!0),ee=n?h[A-1]:void 0,te={},M={kind:[`field`,`accessor`,`method`,`getter`,`setter`,`class`][i],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw TypeError(`attempted to call addInitializer after decoration was finished`);y(t,`An initializer`,`be`,!0),a.push(t)}.bind(null,te)};if(b)s=j.call(ee,k,M),te.v=1,y(s,`class decorators`,`return`)&&(k=s);else if(M.static=l,M.private=u,s=M.access={has:u?f.bind():function(e){return r in e}},C||(s.get=u?w?function(e){return p(e),E.value}:T(`get`,0,p):function(e){return e[r]}),w||S||(s.set=u?T(`set`,0,p):function(e,t){e[r]=t}),k=j.call(ee,x?{get:E.get,set:E.set}:E[O],M),te.v=1,x){if(typeof k==`object`&&k)(s=y(k.get,`accessor.get`))&&(E.get=s),(s=y(k.set,`accessor.set`))&&(E.set=s),(s=y(k.init,`accessor.init`))&&D.unshift(s);else if(k!==void 0)throw TypeError(`accessor decorators must return an object with get, set, or init properties or undefined`)}else y(k,(d?`field`:`method`)+` decorators`,`return`)&&(d?D.unshift(k):E[O]=k)}return i<2&&c.push(v(D,l,1),v(a,l,0)),d||b||(u?x?c.splice(-1,0,T(`get`,l),T(`set`,l)):c.push(w?E[O]:y.call.bind(E[O])):m(e,r,E)),k}function x(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return a!==void 0&&(o=a[p]),o=h(o??null),u=[],d=function(e){e&&u.push(v(e))},f=function(t,r){for(var a=0;a<n.length;a++){var o=n[a],s=o[1],d=7&s;if((8&s)==t&&!d==r){var f=o[2],p=!!o[3],m=16&s;b(t?e:e.prototype,o,m,p?`#`+f:Kt(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return Yt(t)===e}:i)}}},f(8,0),f(0,0),f(8,1),f(0,1),d(c),d(l),s=u,_||x(e),{e:s,get c(){var n=[];return _&&[x(e=b(e,[t],r,e.name,5,n)),v(n,1)]}}}function Kt(e){var t=qt(e,`string`);return typeof t==`symbol`?t:t+``}function qt(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Jt(e,t,n){typeof t==`symbol`&&(t=(t=t.description)?`[`+t+`]`:``);try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+` `+t:t})}catch{}return e}function Yt(e){if(Object(e)!==e)throw TypeError(`right-hand side of 'in' should be an object, got `+(e===null?`null`:typeof e));return e}const Xt=`file:`;var Zt=class n{static{[Wt]=Gt(this,[],[[B,3,`isBunAvailable`],[B,3,`usesBunPackageManager`],[B,3,`buildCommand`],[B,3,`rootDirPath`],[B,3,`dockerfile`],[B,3,`hasDockerfile`],[B,3,`hasSourceCode`],[B,3,`hasOwnSourceCode`],[B,3,`name`],[B,3,`dockerImageName`],[B,3,`requiresNextPublicWbEnv`],[B,3,`packageJson`],[B,3,`packageJsonPath`],[B,3,`generatesWorkerTypes`],[B,3,`hasPrisma`],[B,3,`prismaDirName`],[B,3,`hasDrizzle`],[B,3,`databaseOrm`],[B,3,`hasVitest`],[B,3,`hasOxlint`],[B,3,`hasTypeAwareOxlint`],[B,3,`hasOxfmt`],[B,3,`hasPrettier`],[B,3,`hasPoetryLock`],[B,3,`hasPubspecYaml`],[B,3,`hasCargoToml`],[B,3,`preferredLinter`],[B,3,`hasPlaywrightConfig`],[B,3,`hasPlaywrightWebServerConfig`],[B,3,`skipLaunchingServerForPlaywright`],[B,3,`dockerPackageJson`],[B,3,`binExists`],[B,3,`rootPackageJson`]]).e}argv=void Wt(this);loadEnv;pathByName=new Map;_dirPath;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return this.usesBunPackageManager}get packageManagerCommand(){return this.isBunAvailable?`bun`:`yarn`}get packageManagerRunCommand(){return this.isBunAvailable?`bun run`:`yarn`}get usesBunPackageManager(){let e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return ht(e)?!1:mt(this.rootDirPath)?!0:gt(e)}get buildCommand(){return this.packageJson.scripts?.build?.includes(`buildIfNeeded`)?`YARN run build`:this.packageJson.scripts?.build?`YARN wb buildIfNeeded ${this.argv.verbose?`--verbose`:``}`:`echo 'No build script'`}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,`..`,`..`,`package.json`))?t.resolve(this.dirPath,`..`,`..`):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile(`Dockerfile`),`utf8`)}get hasDockerfile(){try{return!!this.findFile(`Dockerfile`)}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,`src`))}get hasOwnSourceCode(){return!this.packageJson.workspaces||this.hasSourceCode}get name(){return this.packageJson.name||`unknown`}get dockerImageName(){return(this.packageJson.name||`unknown`).replaceAll(`@`,``).replaceAll(`/`,`-`)}declaredEnvKeyCache;get declaredEnvKeys(){if(this.declaredEnvKeyCache)return this.declaredEnvKeyCache;if(!this.loadEnv)return this.declaredEnvKeyCache=new Set,this.declaredEnvKeyCache;let[,e]=N(this.argv,this.dirPath,{ignoreProcessEnv:!0});return this.declaredEnvKeyCache=ft(e),this.declaredEnvKeyCache}envCache;get env(){if(this.envCache)return this.envCache;if(!this.loadEnv)return this.envCache=process.env,this.envCache;let[e,t]=en(this.argv,this.dirPath);return this.envCache=e,this.completeAndValidateWbEnv(t.some(([e])=>!e.startsWith(`mise env`))),this.envCache}static standardWbEnvModes=new Set([`development`,`test`,`staging`,`production`]);completeAndValidateWbEnv(e){let t=this.envCache;if(!t||t.WB_SKIP_ENV_CHECK===`1`||t.WB_SKIP_ENV_CHECK===`true`)return;if(H(t.CI)&&!process.env.WB_ENV&&e&&(console.error(p.red(`WB_ENV is not exported on CI. Export WB_ENV explicitly (the reusable workflows pass it via the "environment" input), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)),!t.WB_ENV){let n=fe(this.argv);t.WB_ENV=n,e&&!Se(this.argv)&&console.info(`WB_ENV is not defined; defaulting to "${n}".`)}n.standardWbEnvModes.has(t.WB_ENV)||(console.error(p.red(`WB_ENV must be one of development, test, staging, or production, but is "${t.WB_ENV}". Fix the value in the env source or the exported variable, or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1));let r=this.argv.cascadeEnv??(this.argv.cascadeNodeEnv?`production`:process.env.WB_ENV||void 0)??(this.argv.autoCascadeEnv===!1?void 0:fe(this.argv));r&&n.standardWbEnvModes.has(r)&&t.WB_ENV!==r&&t.WB_ENV!==this.argv.commandDefaultWbEnv&&(console.error(p.red(`WB_ENV resolves to "${t.WB_ENV}" although the "${r}" environment was selected. Fix the WB_ENV defined in the mode's env source (e.g. the fnox "${r}" profile), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)),this.requiresNextPublicWbEnv&&t.NEXT_PUBLIC_WB_ENV!==t.WB_ENV&&(t.NEXT_PUBLIC_WB_ENV&&!Se(this.argv)&&console.info(`Overriding NEXT_PUBLIC_WB_ENV ("${t.NEXT_PUBLIC_WB_ENV}") with WB_ENV ("${t.WB_ENV}").`),t.NEXT_PUBLIC_WB_ENV=t.WB_ENV)}get requiresNextPublicWbEnv(){return!!this.getOwnDependencyVersion(`next`)||!!this.getOwnDependencyVersion(`vinext`)}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,`utf8`))}get packageJsonPath(){return t.join(this.dirPath,`package.json`)}get generatesWorkerTypes(){return!zt(this)||!this.hasOwnDependency(`wrangler`)||un(this.packageJson.scripts??{},this.dirPath)?!1:ln(this.dirPath,`worker-configuration.d.ts`)}get hasPrisma(){return!!this.getOwnDependencyVersion(`prisma`)}get prismaDirName(){return e.existsSync(t.join(this.dirPath,`db`,`schema.prisma`))?`db`:`prisma`}get hasDrizzle(){return!!this.getOwnDependencyVersion(`drizzle-orm`)}get databaseOrm(){if(this.hasPrisma)return`prisma`;if(this.hasDrizzle)return`drizzle`}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency(`oxlint`)}get hasTypeAwareOxlint(){return this.hasOxlint&&this.hasDependency(`oxlint-tsgolint`)}get hasOxfmt(){return this.hasDependency(`oxfmt`)}get hasPrettier(){return this.hasDependency(`prettier`)}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,`poetry.lock`))||e.existsSync(t.join(this.rootDirPath,`poetry.lock`))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,`pubspec.yaml`))||e.existsSync(t.join(this.rootDirPath,`pubspec.yaml`))}get hasCargoToml(){return e.existsSync(t.join(this.dirPath,`Cargo.toml`))}get preferredLinter(){if(this.hasOxlint)return`oxlint`}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile(`playwright.config.ts`)}catch{return!1}}get hasPlaywrightWebServerConfig(){try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}get skipLaunchingServerForPlaywright(){return!H(this.env.CI)&&this.hasPlaywrightWebServerConfig}get dockerPackageJson(){let n=t.dirname(this.findFile(`Dockerfile`));return n===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`))}get binExists(){return V(this.dirPath,this.env)}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join(`..`,`..`,n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,`package.json`),`utf8`))}catch(e){console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,`package.json`)}`,e);return}}};function Qt(e){let t=e.env.DATABASE_URL;if(!t?.startsWith(`file:`))return;let n=t.slice(5).replace(/[?#].*$/,``);return(n.startsWith(`//`)?n.slice(2):n)||void 0}function $t(e){let n=Qt(e);if(!n)return;if(t.isAbsolute(n))return n;let r=e.rootDirPath??e.dirPath;return r?t.resolve(r,n):void 0}function en(e,t){let[n,r]=N(e,t,{expandFallbackWbEnv:!0});if(!Se(e))for(let[e,t]of r)console.info(`Loaded ${t.length} environment variables from ${e}`);return[{...process.env,...n},r]}const tn=new Map,nn=new Map;function rn(e,n,r){let{autoCascadeEnv:i,cascadeEnv:a,cascadeNodeEnv:o,commandDefaultWbEnv:s,quietEnv:c,verbose:l}=e,{silent:u}=e;return JSON.stringify([t.resolve(r),n,i,a,o,s,c,l,u,process.env.WB_ENV,`production`,process.env.CI])}function K(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=rn(n,r,i),o=tn.get(a);return o||(o=new Zt(i,n,r),tn.set(a,o)),o}function an(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function q(e,t=!0,n){let r=on(e,t,n);if(!r)return;if(r.root!==r.self)return{...r,descendants:[r.self]};let i=rn(e,t,r.root.dirPath),a=nn.get(i);return a||(a=sn(e,r.root,t),nn.set(i,a)),{...r,descendants:await a}}function on(e,n=!0,r){r??=process.cwd();let i=K(e,n,r);if(!i)return;let a=i;return!i.packageJson.workspaces&&t.dirname(r).endsWith(`/packages`)&&(a=K(e,n,t.resolve(r,`..`,`..`))??i),{root:a,self:i}}async function sn(e,t,n){return[t,...(await cn(t)).map(t=>K(e,n,t)??new Zt(t,e,n))]}async function cn(n){if(n.usesBunPackageManager)return j(n.packageJson.workspaces,n.dirPath).map(e=>t.join(n.dirPath,t.posix.dirname(e)));let r=re(n.packageJson.workspaces).filter(e=>!e.startsWith(`!`)&&ie(e));if(r.length===0)return[];let i={cwd:n.dirPath,expandDirectories:!1,followSymbolicLinks:!1,ignore:[`**/node_modules/**`]},a=await m(r.map(e=>t.posix.join(e,`package.json`)),i),o=new Set(a),s=r.filter(e=>e.includes(`?`));if(s.length>0)for(let r of await m(s,{...i,onlyDirectories:!0})){let i=t.posix.join(r,`package.json`);e.existsSync(t.join(n.dirPath,i))&&o.add(i)}let c=[...o],l=e.realpathSync(n.dirPath),u=c.filter(r=>{if(r===`package.json`)return!1;try{let i=t.relative(l,e.realpathSync(t.join(n.dirPath,r)));return i!==`..`&&!i.startsWith(`../`)&&!t.isAbsolute(i)}catch{return!1}}).map(e=>t.join(n.dirPath,t.posix.dirname(e)));return[...new Set(u)].toSorted()}function ln(n,r){try{return e.readFileSync(t.join(n,`.gitignore`),`utf8`).split(`
|
|
14
|
-
`).some(e=>e.trim()===`/${r}`)}catch{return!1}}function un(
|
|
13
|
+
`)){if(/^\s*(?:#|\/\/)/u.test(n))continue;let e=r.exec(n);if(e)return e[1]}}function Ht(e,t){return`YARN wrangler d1 execute ${t} --local --persist-to "${Ut(e)}" --command "SELECT 1" > /dev/null`}function Ut(e){let t=[e.env.WB_ENV,e.env.MISE_ENV].includes(`test`)?`test`:e.env.WB_ENV||e.env.MISE_ENV;return!t||t===`development`?`.wrangler/state`:`.wrangler/state-${t}`}let Wt;function Gt(e,t,n,r,i,a){var o,s,c,l,u,d,f,p=Symbol.metadata||Symbol.for(`Symbol.metadata`),m=Object.defineProperty,h=Object.create,g=[h(null),h(null)],_=t.length;function v(t,n,r){return function(i,a){n&&(a=i,i=e);for(var o=0;o<t.length;o++)a=t[o].apply(i,r?[a]:[]);return r?a:i}}function y(e,t,n,r){if(typeof e!=`function`&&(r||e!==void 0))throw TypeError(t+` must `+(n||`be`)+` a function`+(r?``:` or undefined`));return e}function b(e,t,n,r,i,a,c,l,u,d,f){function p(e){if(!f(e))throw TypeError(`Attempted to access private element on non-instance`)}var h=[].concat(t[0]),_=t[3],b=!c,x=i===1,S=i===3,C=i===4,w=i===2;function T(t,n,r){return function(i,a){return n&&(a=i,i=e),r&&r(i),E[t].call(i,a)}}if(!b){var E={},D=[],O=S?`get`:C||x?`set`:`value`;if(u?(d||x?E={get:Jt(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||Jt(E[O],r,w?``:O)):d||(E=Object.getOwnPropertyDescriptor(e,r)),!d&&!u){if((s=g[+l][r])&&(s^i)!==7)throw Error(`Decorating two elements with the same name (`+E[O].name+`) is not supported yet`);g[+l][r]=i<3?1:i}}for(var k=e,A=h.length-1;A>=0;A-=n?2:1){var j=y(h[A],`A decorator`,`be`,!0),ee=n?h[A-1]:void 0,te={},M={kind:[`field`,`accessor`,`method`,`getter`,`setter`,`class`][i],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw TypeError(`attempted to call addInitializer after decoration was finished`);y(t,`An initializer`,`be`,!0),a.push(t)}.bind(null,te)};if(b)s=j.call(ee,k,M),te.v=1,y(s,`class decorators`,`return`)&&(k=s);else if(M.static=l,M.private=u,s=M.access={has:u?f.bind():function(e){return r in e}},C||(s.get=u?w?function(e){return p(e),E.value}:T(`get`,0,p):function(e){return e[r]}),w||S||(s.set=u?T(`set`,0,p):function(e,t){e[r]=t}),k=j.call(ee,x?{get:E.get,set:E.set}:E[O],M),te.v=1,x){if(typeof k==`object`&&k)(s=y(k.get,`accessor.get`))&&(E.get=s),(s=y(k.set,`accessor.set`))&&(E.set=s),(s=y(k.init,`accessor.init`))&&D.unshift(s);else if(k!==void 0)throw TypeError(`accessor decorators must return an object with get, set, or init properties or undefined`)}else y(k,(d?`field`:`method`)+` decorators`,`return`)&&(d?D.unshift(k):E[O]=k)}return i<2&&c.push(v(D,l,1),v(a,l,0)),d||b||(u?x?c.splice(-1,0,T(`get`,l),T(`set`,l)):c.push(w?E[O]:y.call.bind(E[O])):m(e,r,E)),k}function x(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return a!==void 0&&(o=a[p]),o=h(o??null),u=[],d=function(e){e&&u.push(v(e))},f=function(t,r){for(var a=0;a<n.length;a++){var o=n[a],s=o[1],d=7&s;if((8&s)==t&&!d==r){var f=o[2],p=!!o[3],m=16&s;b(t?e:e.prototype,o,m,p?`#`+f:Kt(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return Yt(t)===e}:i)}}},f(8,0),f(0,0),f(8,1),f(0,1),d(c),d(l),s=u,_||x(e),{e:s,get c(){var n=[];return _&&[x(e=b(e,[t],r,e.name,5,n)),v(n,1)]}}}function Kt(e){var t=qt(e,`string`);return typeof t==`symbol`?t:t+``}function qt(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Jt(e,t,n){typeof t==`symbol`&&(t=(t=t.description)?`[`+t+`]`:``);try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+` `+t:t})}catch{}return e}function Yt(e){if(Object(e)!==e)throw TypeError(`right-hand side of 'in' should be an object, got `+(e===null?`null`:typeof e));return e}const Xt=`file:`;var Zt=class n{static{[Wt]=Gt(this,[],[[B,3,`isBunAvailable`],[B,3,`usesBunPackageManager`],[B,3,`buildCommand`],[B,3,`rootDirPath`],[B,3,`dockerfile`],[B,3,`hasDockerfile`],[B,3,`hasSourceCode`],[B,3,`hasOwnSourceCode`],[B,3,`name`],[B,3,`dockerImageName`],[B,3,`requiresNextPublicWbEnv`],[B,3,`packageJson`],[B,3,`packageJsonPath`],[B,3,`generatesWorkerTypes`],[B,3,`hasPrisma`],[B,3,`prismaDirName`],[B,3,`hasDrizzle`],[B,3,`databaseOrm`],[B,3,`hasVitest`],[B,3,`hasOxlint`],[B,3,`hasTypeAwareOxlint`],[B,3,`hasOxfmt`],[B,3,`hasPrettier`],[B,3,`hasPoetryLock`],[B,3,`hasPubspecYaml`],[B,3,`hasCargoToml`],[B,3,`preferredLinter`],[B,3,`hasPlaywrightConfig`],[B,3,`hasPlaywrightWebServerConfig`],[B,3,`skipLaunchingServerForPlaywright`],[B,3,`dockerPackageJson`],[B,3,`binExists`],[B,3,`rootPackageJson`]]).e}argv=void Wt(this);loadEnv;pathByName=new Map;_dirPath;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return this.usesBunPackageManager}get packageManagerCommand(){return this.isBunAvailable?`bun`:`yarn`}get packageManagerRunCommand(){return this.isBunAvailable?`bun run`:`yarn`}get usesBunPackageManager(){let e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return ht(e)?!1:mt(this.rootDirPath)?!0:gt(e)}get buildCommand(){return this.packageJson.scripts?.build?.includes(`buildIfNeeded`)?`YARN run build`:this.packageJson.scripts?.build?`YARN wb buildIfNeeded ${this.argv.verbose?`--verbose`:``}`:`echo 'No build script'`}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,`..`,`..`,`package.json`))?t.resolve(this.dirPath,`..`,`..`):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile(`Dockerfile`),`utf8`)}get hasDockerfile(){try{return!!this.findFile(`Dockerfile`)}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,`src`))}get hasOwnSourceCode(){return!this.packageJson.workspaces||this.hasSourceCode}get name(){return this.packageJson.name||`unknown`}get dockerImageName(){return(this.packageJson.name||`unknown`).replaceAll(`@`,``).replaceAll(`/`,`-`)}declaredEnvKeyCache;get declaredEnvKeys(){if(this.declaredEnvKeyCache)return this.declaredEnvKeyCache;if(!this.loadEnv)return this.declaredEnvKeyCache=new Set,this.declaredEnvKeyCache;let[,e]=N(this.argv,this.dirPath,{ignoreProcessEnv:!0});return this.declaredEnvKeyCache=ft(e),this.declaredEnvKeyCache}envCache;get env(){if(this.envCache)return this.envCache;if(!this.loadEnv)return this.envCache=process.env,this.envCache;let[e,t]=en(this.argv,this.dirPath);return this.envCache=e,this.completeAndValidateWbEnv(t.some(([e])=>!e.startsWith(`mise env`))),this.envCache}static standardWbEnvModes=new Set([`development`,`test`,`staging`,`production`]);completeAndValidateWbEnv(e){let t=this.envCache;if(!t||t.WB_SKIP_ENV_CHECK===`1`||t.WB_SKIP_ENV_CHECK===`true`)return;if(H(t.CI)&&!process.env.WB_ENV&&e&&(console.error(p.red(`WB_ENV is not exported on CI. Export WB_ENV explicitly (the reusable workflows pass it via the "environment" input), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)),!t.WB_ENV){let n=fe(this.argv);t.WB_ENV=n,e&&!Se(this.argv)&&console.info(`WB_ENV is not defined; defaulting to "${n}".`)}n.standardWbEnvModes.has(t.WB_ENV)||(console.error(p.red(`WB_ENV must be one of development, test, staging, or production, but is "${t.WB_ENV}". Fix the value in the env source or the exported variable, or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1));let r=this.argv.cascadeEnv??(this.argv.cascadeNodeEnv?`production`:process.env.WB_ENV||void 0)??(this.argv.autoCascadeEnv===!1?void 0:fe(this.argv));r&&n.standardWbEnvModes.has(r)&&t.WB_ENV!==r&&t.WB_ENV!==this.argv.commandDefaultWbEnv&&(console.error(p.red(`WB_ENV resolves to "${t.WB_ENV}" although the "${r}" environment was selected. Fix the WB_ENV defined in the mode's env source (e.g. the fnox "${r}" profile), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)),this.requiresNextPublicWbEnv&&t.NEXT_PUBLIC_WB_ENV!==t.WB_ENV&&(t.NEXT_PUBLIC_WB_ENV&&!Se(this.argv)&&console.info(`Overriding NEXT_PUBLIC_WB_ENV ("${t.NEXT_PUBLIC_WB_ENV}") with WB_ENV ("${t.WB_ENV}").`),t.NEXT_PUBLIC_WB_ENV=t.WB_ENV)}get requiresNextPublicWbEnv(){return!!this.getOwnDependencyVersion(`next`)||!!this.getOwnDependencyVersion(`vinext`)}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,`utf8`))}get packageJsonPath(){return t.join(this.dirPath,`package.json`)}get generatesWorkerTypes(){return!zt(this)||!this.hasOwnDependency(`wrangler`)||un(this.packageJson.scripts??{})?!1:ln(this.dirPath,`worker-configuration.d.ts`)}get hasPrisma(){return!!this.getOwnDependencyVersion(`prisma`)}get prismaDirName(){return e.existsSync(t.join(this.dirPath,`db`,`schema.prisma`))?`db`:`prisma`}get hasDrizzle(){return!!this.getOwnDependencyVersion(`drizzle-orm`)}get databaseOrm(){if(this.hasPrisma)return`prisma`;if(this.hasDrizzle)return`drizzle`}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency(`oxlint`)}get hasTypeAwareOxlint(){return this.hasOxlint&&this.hasDependency(`oxlint-tsgolint`)}get hasOxfmt(){return this.hasDependency(`oxfmt`)}get hasPrettier(){return this.hasDependency(`prettier`)}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,`poetry.lock`))||e.existsSync(t.join(this.rootDirPath,`poetry.lock`))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,`pubspec.yaml`))||e.existsSync(t.join(this.rootDirPath,`pubspec.yaml`))}get hasCargoToml(){return e.existsSync(t.join(this.dirPath,`Cargo.toml`))}get preferredLinter(){if(this.hasOxlint)return`oxlint`}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile(`playwright.config.ts`)}catch{return!1}}get hasPlaywrightWebServerConfig(){try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}get skipLaunchingServerForPlaywright(){return!H(this.env.CI)&&this.hasPlaywrightWebServerConfig}get dockerPackageJson(){let n=t.dirname(this.findFile(`Dockerfile`));return n===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`))}get binExists(){return V(this.dirPath,this.env)}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join(`..`,`..`,n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,`package.json`),`utf8`))}catch(e){console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,`package.json`)}`,e);return}}};function Qt(e){let t=e.env.DATABASE_URL;if(!t?.startsWith(`file:`))return;let n=t.slice(5).replace(/[?#].*$/,``);return(n.startsWith(`//`)?n.slice(2):n)||void 0}function $t(e){let n=Qt(e);if(!n)return;if(t.isAbsolute(n))return n;let r=e.rootDirPath??e.dirPath;return r?t.resolve(r,n):void 0}function en(e,t){let[n,r]=N(e,t,{expandFallbackWbEnv:!0});if(!Se(e))for(let[e,t]of r)console.info(`Loaded ${t.length} environment variables from ${e}`);return[{...process.env,...n},r]}const tn=new Map,nn=new Map;function rn(e,n,r){let{autoCascadeEnv:i,cascadeEnv:a,cascadeNodeEnv:o,commandDefaultWbEnv:s,quietEnv:c,verbose:l}=e,{silent:u}=e;return JSON.stringify([t.resolve(r),n,i,a,o,s,c,l,u,process.env.WB_ENV,`production`,process.env.CI])}function K(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=rn(n,r,i),o=tn.get(a);return o||(o=new Zt(i,n,r),tn.set(a,o)),o}function an(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function q(e,t=!0,n){let r=on(e,t,n);if(!r)return;if(r.root!==r.self)return{...r,descendants:[r.self]};let i=rn(e,t,r.root.dirPath),a=nn.get(i);return a||(a=sn(e,r.root,t),nn.set(i,a)),{...r,descendants:await a}}function on(e,n=!0,r){r??=process.cwd();let i=K(e,n,r);if(!i)return;let a=i;return!i.packageJson.workspaces&&t.dirname(r).endsWith(`/packages`)&&(a=K(e,n,t.resolve(r,`..`,`..`))??i),{root:a,self:i}}async function sn(e,t,n){return[t,...(await cn(t)).map(t=>K(e,n,t)??new Zt(t,e,n))]}async function cn(n){if(n.usesBunPackageManager)return j(n.packageJson.workspaces,n.dirPath).map(e=>t.join(n.dirPath,t.posix.dirname(e)));let r=re(n.packageJson.workspaces).filter(e=>!e.startsWith(`!`)&&ie(e));if(r.length===0)return[];let i={cwd:n.dirPath,expandDirectories:!1,followSymbolicLinks:!1,ignore:[`**/node_modules/**`]},a=await m(r.map(e=>t.posix.join(e,`package.json`)),i),o=new Set(a),s=r.filter(e=>e.includes(`?`));if(s.length>0)for(let r of await m(s,{...i,onlyDirectories:!0})){let i=t.posix.join(r,`package.json`);e.existsSync(t.join(n.dirPath,i))&&o.add(i)}let c=[...o],l=e.realpathSync(n.dirPath),u=c.filter(r=>{if(r===`package.json`)return!1;try{let i=t.relative(l,e.realpathSync(t.join(n.dirPath,r)));return i!==`..`&&!i.startsWith(`../`)&&!t.isAbsolute(i)}catch{return!1}}).map(e=>t.join(n.dirPath,t.posix.dirname(e)));return[...new Set(u)].toSorted()}function ln(n,r){try{return e.readFileSync(t.join(n,`.gitignore`),`utf8`).split(`
|
|
14
|
+
`).some(e=>e.trim()===`/${r}`)}catch{return!1}}function un(e){let t=/(?:^|\s)wrangler\s+types(?:\s|$)/u,n=/^(?:(?:bunx|npx)\s+|(?:yarn|pnpm)\s+dlx\s+)?wrangler\s+types(?:\s+--env-file\s+\S+)*$/u;return Object.values(e).some(e=>!e||!t.test(e)?!1:/[;|<>`$'"()]|\bcd\s/u.test(e)?!0:e.split(`&&`).map(e=>e.trim().replaceAll(/\s+/gu,` `)).some(e=>{if(!t.test(e)||/(?:^|\s)(?:--help|-h)(?:\s|=|$)/u.test(e))return!1;let r=e.replace(/(?:^|\s)--check(?:\s|=|$)/u,` `).replaceAll(/\s+/gu,` `).trim(),i=r===e?e:r;return!n.test(i)}))}const dn={command:`buildIfNeeded`,describe:`Build code if changes are detected`,builder:{command:{description:`A build command (default: yarn|bun build)`,type:`string`,alias:`c`},output:{description:`Build output paths (relative to the project directory) that must exist for the cache to be valid (default: auto-detected common output directories)`,type:`array`,alias:`o`}},async handler(e){await fn(e)}};async function fn(n,r){let i=K(n,!0,r);if(!i)return console.error(p.red(`No project found.`)),!0;let a=n.command??(i.packageJson.scripts?.build?`${i.packageManagerRunCommand} build`:void 0);if(!a)return console.info(p.green(`Skip to build because no build command is defined.`)),!1;n={...n,command:a};let o=e.existsSync(t.join(i.rootDirPath,`.git`))?_n(i):void 0;if(!o)return vn(i,n),!0;let[s,c,l]=await bn(i,n,o);if(s)return console.info(p.green(`Skip to run '${n.command}' 💫`)),!1;if(vn(i,n)){if(!n.dryRun){let t=mn(n)??hn(i);t.length===0&&console.info(p.yellow(`No build output directory detected; pass --output to enable missing-output cache invalidation.`)),await e.promises.writeFile(c,JSON.stringify({hash:l,outputPaths:t}),`utf8`)}return!0}}const pn=[`dist`,`build`,`.next`,`out`];function mn(e){return e.output?.length?e.output.map(String):void 0}function hn(n){return pn.filter(r=>e.existsSync(t.join(n.dirPath,r)))}function gn(e,t){return e.some(e=>t===e||t.startsWith(`${e}/`))}function _n(e){let t=o.spawnSync(`git`,[`rev-parse`,`--verify`,`HEAD`],{cwd:e.dirPath,encoding:`utf8`,stdio:`pipe`});return t.status===0?t.stdout.trim():void 0}function vn(e,t){if(console.info(p.green(`Run '${t.command}'`)),!t.dryRun){let n=o.spawnSync(t.command??``,{cwd:e.dirPath,env:e.env,shell:!0,stdio:`inherit`});if(n.status!==0)return process.exitCode=n.status??1,!1}return!0}const yn=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function bn(n,r,a){let o=t.resolve(n.dirPath,`node_modules`,`.cache`,`build`),s=t.resolve(o,`last-build`);await e.promises.mkdir(o,{recursive:!0});let c=i(`sha256`);c.update(a),c.update(r.command??``);let l=JSON.stringify(Object.entries(n.env).filter(([e])=>!yn.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));c.update(l),await Tn(n,r,c);let u=c.digest(`hex`),d=xn(await qe(()=>e.promises.readFile(s,`utf8`)));if(d?.hash!==u)return[!1,s,u];let f=(mn(r)??d.outputPaths).filter(r=>!e.existsSync(t.resolve(n.dirPath,r)));return f.length>0?(console.info(p.yellow(`Rebuilding because build outputs are missing: ${f.join(`, `)}`)),[!1,s,u]):[!0,s,u]}function xn(e){if(e)try{let t=JSON.parse(e);if(typeof t?.hash!=`string`)return;let n=Array.isArray(t.outputPaths)?t.outputPaths.filter(e=>typeof e==`string`):[];return{hash:t.hash,outputPaths:n}}catch{return}}const Sn=new Set([`src`,`public`]),Cn=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],wn=new Set([`test`,`tests`,`__tests__`,`test-fixtures`]);async function Tn(n,r,i){return new Promise(a=>{let s=o.spawnSync(`git`,[`status`,`--porcelain`,`-uall`,`-z`],{cwd:n.dirPath,env:n.env,stdio:`pipe`,encoding:`utf8`}).stdout.split(`\0`).filter(e=>e.length>0),c=[];for(let e=0;e<s.length;e++){let t=s[e],n=t.slice(0,2);if(c.push({untracked:n===`??`,filePath:t.slice(3)}),n.includes(`R`)||n.includes(`C`)){let t=s[++e];t&&c.push({untracked:!1,filePath:t})}}let l=c.map(e=>({...e,hashPath:n.env.WB_ENV===`test`?e.filePath.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,``):e.filePath})),u=t.relative(n.rootDirPath,n.dirPath),d=(mn(r)??[]).map(e=>t.join(u,e)),f=l.filter(({filePath:e,hashPath:t})=>{let n=t.split(`/`).slice(0,-1);return(n.some(e=>Sn.has(e))||Cn.some(e=>t.endsWith(e)))&&!n.some(e=>wn.has(e))&&!gn(d,e)});r.verbose&&console.info(`Changed files: ${f.map(e=>e.hashPath).join(`, `)}`);for(let r of f.filter(e=>e.untracked))try{i.update(r.hashPath),i.update(e.readFileSync(t.join(n.rootDirPath,r.filePath)))}catch{}let p=f.filter(e=>!e.untracked).map(e=>e.hashPath);if(p.length===0){a();return}let m=o.spawn(`git`,[`diff`,`HEAD`,`--`,...p],{cwd:n.rootDirPath});m.stdout.on(`data`,e=>{i.update(e),r.verbose&&(console.info(`Data:`,e),console.info(`Hash:`,i.copy().digest(`hex`)))}),m.on(`close`,()=>{a()})})}const En=new h,Dn={exitIfFailed:!0};async function J(e,t,n,r=Dn){let i=An(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||jn(i.printable,t,n.silent?`Command`:`Start`),n.verbose&&jn(i.runnable,t,`Start (raw)`,!0),n.dryRun)return Mn(i.printable,0,r,{silentSuccess:n.silent}),0;let a=!!(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly)),o=!1,s=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write(`.`),o=!0},r.silentProgressIntervalMs):void 0,c=await F(i.runnable,void 0,{cwd:t.dirPath,env:Nn(t.env,{...r,preserveColor:r.preserveColor??(n.silent?!0:void 0)}),shell:!0,stdio:n.silent?`pipe`:`inherit`,timeout:r.timeout,mergeOutAndError:a,killOnExit:!0,printingStdout:n.silent&&!a,printingStderr:n.silent&&!a,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{s&&clearInterval(s)}),l=c.status??1;if(o&&process.stdout.write(`
|
|
15
15
|
`),a&&(!r.printSilentOutputOnFailureOnly||l!==0)){let e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write(`
|
|
16
16
|
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(p.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),Mn(i.printable,l,r,{silentSuccess:n.silent}),l}function On(e,t,n,r=Dn){return En.runAndWaitForReturnValue(async()=>{let i=An(e,t);if(jn(i.printable,t,`Start (parallel)`,!0),n.dryRun)return jn(i.printable,t,`Started (log)`),n.verbose&&jn(i.runnable,t,`Started (raw)`,!0),Mn(i.printable,0,r),0;let a=await F(i.runnable,void 0,{cwd:t.dirPath,env:Nn(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:`pipe`,timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(a.signal),jn(i.printable,t,`Started (log)`),n.verbose&&jn(i.runnable,t,`Started (raw)`,!0);let o=a.stdout.trim();return o&&!r.printRawOutput&&(process.stdout.write(o),process.stdout.write(`
|
|
17
17
|
`)),Mn(i.printable,a.status,r),a.status??1})}function kn(e,t,n,r=Dn){return En.runAndWaitForReturnValue(async()=>{let i=An(e,t);if(n.dryRun)return{exitCode:0,output:``};let a=await F(i.runnable,void 0,{cwd:t.dirPath,env:Nn(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:`pipe`,timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(a.signal),{exitCode:a.status??1,output:a.stdout}})}function An(e,t){let n=t.usesBunPackageManager?`bun run`:`yarn`,r=e.replaceAll(`
|
|
@@ -116,4 +116,4 @@ No type errors found. Please ignore the previous type errors, as they were cause
|
|
|
116
116
|
`+p.green(p.bold(`Verified in ${zl(a)}:`)));for(let[t,a]of e.entries()){let e=r[t].padStart(i),o=a.detail?` ${a.detail}`:``;console.info(p.green(` ✔ `)+a.name.padEnd(n)+p.gray(` ${e}${o}`))}}async function Pl(e,t,n,r={}){if(Il(e,t.dirPath),n.dryRun)return 0;let i=await F(e,void 0,{cwd:t.dirPath,env:Nn(t.env,{preserveColor:!1}),shell:!0,stdio:`pipe`,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),a=i.status??1;return r.printRawOutput||Fl(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(p.red(p.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function Fl(e,t,n){if(t===0&&/^(?:bun|yarn) (?:install|gen-code)$/u.test(e)){console.info(p.green(`Succeeded.`));return}let r=n.trim();r&&(process.stdout.write(r),process.stdout.write(`
|
|
117
117
|
`))}function Il(e,t){console.info(`
|
|
118
118
|
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function Ll(n){let r=Date.now(),i=t.join(n.dirPath,`.wb`);e.mkdirSync(i,{recursive:!0});let a=t.join(i,`verify-full.log`),o=e.openSync(a,`w`),s=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),l=!1,u=!1;process.stdout.write=Rl(s,o),process.stderr.write=Rl(c,o),console.info(p.cyan(p.bold(`Full log:`),a));let d=()=>{if(u)return;u=!0,process.stdout.write=s,process.stderr.write=c;let t=Bl(Date.now()-r),n=`${l?`Succeeded`:`Failed`} in ${t}. Full log: ${a}\n`,i=l?p.green(n):p.red(n);s(i),e.writeSync(o,n),e.closeSync(o)};return process.once(`exit`,d),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener(`exit`,d),d()},succeed:()=>{l=!0}}}function Rl(t,n){return((r,i,a)=>{let o=typeof r==`string`?Buffer.from(r,typeof i==`string`?i:`utf8`):r;return e.writeSync(n,o),t(o,typeof i==`function`?i:a)})}function zl(e){return e<6e4?`${(e/1e3).toFixed(1)}s`:Bl(e)}function Bl(e){let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}Ve(process.argv),await d(f(process.argv)).scriptName(`wb`).options(Ot).middleware(e=>{let n=e[`working-dir`];if(n){let e=t.resolve(n);process.chdir(e)}let r=Vl();r&&Hl(r)&&console.warn(`Warning: \`node\` on PATH is a Bun shim (${r}); run wb without \`--bun\` and remove \`[run] bun\` from bunfig.toml.`),e._[0]!==`run`&&Ce(process.env)}).command(wl).command(dn).command(Fn).command(zn).command(Or).command(Fr).command(ai).command(mi).command(_i).command(yi).command(Pi).command(Ca).command(Bo).command(vs).command(Ws).command(Gs).command(lc).command(uc).command(hc).command(co).command(Yc).command(el).command(gl).command(vl).command(yl).command(Cl).demandCommand().strict().version(Ul()).help().argv;function Vl(){for(let n of(process.env.PATH??``).split(t.delimiter)){if(!n)continue;let r=t.join(n,`node`);try{if(e.accessSync(r,e.constants.X_OK),e.statSync(r).isFile())return r}catch{}}}function Hl(n){if(t.basename(t.dirname(n)).startsWith(`bun-node-`))return!0;try{return t.basename(e.realpathSync(n))===`bun`}catch{return!1}}function Ul(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,`package.json`));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)).version}let Wl=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!Wl){Wl=!0;try{P(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
119
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJub3JtYWxpemVCdW5Mb2NrZmlsZSIsInN0YW5kYXJkV2JFbnZNb2RlcyIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwicnVuQ29tbWFuZCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsImUiLCJ0IiwibiIsInIiLCJpIiwiciIsInQiLCJuIiwiciIsIm4iLCJuIiwiZSIsImkiLCJ0IiwiZSIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImFyZ3VtZW50c0J1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJwYXJzZSIsImRlcGxveUNvbW1hbmQiLCJub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSIsInBhcnNlVG9tbCIsImJ1aWxkZXIiLCJwYXJzZURvdGVudiIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZGVwbG95Q29tbWFuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi9iaW4vcnVuQXJncy5qcyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL2NvbnN0cnVjdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2dldENhY2hlS2V5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplT25lLmpzIiwiLi4vc3JjL3V0aWxzL2JpblBhdGgudHMiLCIuLi9zcmMvdXRpbHMvY2kudHMiLCIuLi9zcmMvdXRpbHMvZW52U291cmNlcy50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NoZWNrRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL2xpdGVzdHJlYW0udHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9idW5Mb2NrZmlsZS50cyIsIi4uL3NyYy91dGlscy9mbm94VG9tbC50cyIsIi4uL3NyYy91dGlscy93b3JrZXJUeXBlc0Vudi50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuRG9ja2VyRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9vdXRwdXQudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvY29tbWFuZHMvbWFpbnRlbmFuY2UudHMiLCIuLi9zcmMvdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yYWlsd2F5RW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JlbGVhc2UudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEEgc2libGluZyB0ZW1wIGZpbGUgbWFrZXMgdGhlIHJlcGxhY2VtZW50IGFuIGF0b21pYyBzYW1lLWRpcmVjdG9yeSByZW5hbWUsIHNvIGFuIGludGVycnVwdGVkXG4gIC8vIHdyaXRlIGNhbm5vdCBsZWF2ZSBhIHRydW5jYXRlZCBidW4ubG9jayBiZWhpbmQuXG4gIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHtsb2NrZmlsZVBhdGh9Lm5vcm1hbGl6aW5nLiR7cHJvY2Vzcy5waWR9LiR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICB0cnkge1xuICAgIC8vIHN0YXQncyBtb2RlIGluY2x1ZGVzIGZpbGUtdHlwZSBiaXRzLCB3aGljaCBjaG1vZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGFjY2VwdC5cbiAgICBjb25zdCBtb2RlID0gZnMuc3RhdFN5bmMobG9ja2ZpbGVQYXRoKS5tb2RlICYgMG83Nzc7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wb3JhcnlQYXRoLCBub3JtYWxpemVkQ29udGVudCwgeyBtb2RlIH0pO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMncyBtb2RlIGlzIG1hc2tlZCBieSB0aGUgcHJvY2VzcyB1bWFzazsgY2htb2QgcmVzdG9yZXMgdGhlIGV4YWN0IG9yaWdpbmFsIGJpdHMuXG4gICAgZnMuY2htb2RTeW5jKHRlbXBvcmFyeVBhdGgsIG1vZGUpO1xuICAgIGZzLnJlbmFtZVN5bmModGVtcG9yYXJ5UGF0aCwgbG9ja2ZpbGVQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmModGVtcG9yYXJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IChmbm94IHByb2ZpbGUgLyBtaXNlIGVudikgdG8gbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBsb2FkaW5nIGluZm9ybWF0aW9uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PiAmIHtcbiAgLyoqXG4gICAqIENvbW1hbmQtbGV2ZWwgZmFsbGJhY2sgZm9yIGFuIHVuc2V0IFdCX0VOViAoZS5nLiBgd2IgdGVzdGAgc3VwcGxpZXMgJ3Rlc3QnIHdoZW4gZXhwbGljaXQgZW52XG4gICAqIGZsYWdzIHN1cHByZXNzIGl0cyBkZWZhdWx0IHRlc3QgY2FzY2FkZSkuIE5vdCBhIENMSSBmbGFnLlxuICAgKi9cbiAgY29tbWFuZERlZmF1bHRXYkVudj86IHN0cmluZztcbn07XG5cbmNvbnN0IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY2FzY2FkZSAoZm5veCBwcm9maWxlIC8gZW52LWZpbGUgc3VmZml4KSB0aGUgcmVhZGVyIGxvYWRzIGZvciB0aGUgZ2l2ZW4gb3B0aW9uczpcbiAqIHRoZSBmb3JjZWQgYC0tY2FzY2FkZS1lbnZgIGZpcnN0LCB0aGVuIGAtLWNhc2NhZGUtbm9kZS1lbnZgJ3MgTk9ERV9FTlYsIHRoZW4gdGhlIGF1dG8gY2FzY2FkZVxuICogZHJpdmVuIGJ5IHRoZSBhbWJpZW50IFdCX0VOVi9OT0RFX0VOVi4gRXhwb3J0ZWQgc28gY29tbWFuZHMgdGhhdCBzZWxlY3QgYSBwcm9maWxlIFdJVEhPVVRcbiAqIGxvYWRpbmcgZW52aXJvbm1lbnQgc291cmNlcyAoZS5nLiBgd2IgZ2VuLWRvY2tlci1lbnZgKSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUgcmVhZGVyJ3Mgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhc2NhZGUoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCBhbiBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyIGV4cHJlc3Npb246XG4gIC8vIGJ1bmRsZXJzIHJlcGxhY2UgdGhhdCBleGFjdCBleHByZXNzaW9uIGF0IGJ1aWxkIHRpbWUgKHNlZSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMpLlxuICBjb25zdCBydW50aW1lRW52ID0gcHJvY2Vzcy5lbnY7XG4gIHJldHVybiAoXG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFdCX0VOViB2YWx1ZSB3YiBmYWxscyBiYWNrIHRvIHdoZW4gbm8gZW52IHNvdXJjZSBhbmQgbm8gZXhwb3J0ZWQgdmFyaWFibGUgZGVmaW5lc1xuICogaXQ6IHRoZSBjb21tYW5kLWxldmVsIGRlZmF1bHQgZmlyc3QgKGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2AgbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXNcbiAqIGJ1dCBpdHMgdGVzdHMgbXVzdCBzdGlsbCBydW4gYXMgYHRlc3RgLCBtaXJyb3JpbmcgdGhlIHByZS0xNSBgfHw9ICd0ZXN0J2AgYmVoYXZpb3IpLCB0aGVuIHRoZVxuICogZm9yY2VkIGNhc2NhZGUsIHRoZW4gdGhlIGFtYmllbnQtTk9ERV9FTlYtZHJpdmVuIGF1dG8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYVxuICogbm9uLXN0YW5kYXJkIE5PREVfRU5WIHN1Y2ggYXMgYHFhYCBzdGlsbCBzZWxlY3RzIHRoZSBjYXNjYWRlIHN1ZmZpeCwgYnV0IG11c3Qgbm90IHByb2R1Y2UgYVxuICogbm9uLXN0YW5kYXJkIFdCX0VOVikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmFsbGJhY2tXYkVudihhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGFyZ3YuY29tbWFuZERlZmF1bHRXYkVudikgcmV0dXJuIGFyZ3YuY29tbWFuZERlZmF1bHRXYkVudjtcbiAgaWYgKGFyZ3YuY2FzY2FkZUVudikgcmV0dXJuIGFyZ3YuY2FzY2FkZUVudjtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIHRoZSBhbGlhcyBmb3IgdGhlIHNhbWUgYnVuZGxlci1pbmxpbmluZyByZWFzb24gYXMgaW5cbiAgLy8gcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBhbmQgZnJvbSB0aGUgQU1CSUVOVCBlbnZpcm9ubWVudCAobm90IGxvYWRlZCBmaWxlcykgYmVjYXVzZSB0aGVcbiAgLy8gY2FzY2FkZSBzZWxlY3Rpb24gYmVsb3cgdXNlcyB0aGUgYW1iaWVudCB2YWx1ZSBhcyB3ZWxsLlxuICBjb25zdCBydW50aW1lRW52ID0gcHJvY2Vzcy5lbnY7XG4gIGNvbnN0IGRlcml2ZWQgPVxuICAgIGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiAnZGV2ZWxvcG1lbnQnO1xuICByZXR1cm4gc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhkZXJpdmVkKSA/IGRlcml2ZWQgOiAnZGV2ZWxvcG1lbnQnO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gYW5kIG1pc2UuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52U291cmNlTmFtZXMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIC8qKlxuICAgICAqIExvYWQgdmFyaWFibGVzIGV2ZW4gaWYgdGhleSBhbHJlYWR5IGV4aXN0IGluIHByb2Nlc3MuZW52LlxuICAgICAqIFVzZWZ1bCB3aGVuIGEgcGFyZW50IHByb2Nlc3MgaGFzIGFscmVhZHkgaW5qZWN0ZWQgdGhlIGZub3ggdmFsdWVzIGludG8gdGhlIGVudmlyb25tZW50XG4gICAgICogYW5kIHRoZSBjb25maWd1cmVkIHZhcmlhYmxlcyB0aGVtc2VsdmVzIGFyZSBuZWVkZWQgKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApLlxuICAgICAqL1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEV4cGFuZCBgJHtXQl9FTlZ9YCByZWZlcmVuY2VzIGFnYWluc3QgdGhlIGZhbGxiYWNrIG1vZGUgd2hlbiBub3RoaW5nIGRlZmluZXMgV0JfRU5WLlxuICAgICAqIE9ubHkgZm9yIGNhbGxlcnMgdGhhdCBzdWJzZXF1ZW50bHkgQ09NUExFVEUgV0JfRU5WIHdpdGggdGhhdCBmYWxsYmFjayAod2IncyBQcm9qZWN0LmVudikuXG4gICAgICovXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudj86IGJvb2xlYW47XG4gIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICAvLyBSZWFkIE5PREVfRU5WIHRocm91Z2ggYW4gYWxpYXMsIG5ldmVyIGFzIHRoZSBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIG1lbWJlciBleHByZXNzaW9uOlxuICAvLyBidW5kbGVycyByZXBsYWNlIHRoYXQgZXhhY3QgZXhwcmVzc2lvbiBhdCBidWlsZCB0aW1lIChyb2xsZG93bi9idWlsZC10cyBpbmxpbmUgaXQgYXNcbiAgLy8gJ3Byb2R1Y3Rpb24nKSwgd2hpY2ggY29uc3RhbnQtZm9sZHMgdGhlIGZhbGxiYWNrIGJlbG93IGFuZCBtYWRlIHRoZSBwdWJsaXNoZWQgd2Igc2VsZWN0XG4gIC8vIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgd2hlbmV2ZXIgV0JfRU5WIHdhcyB1bnNldC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBjYXNjYWRlID0gcmVzb2x2ZUNhc2NhZGUoYXJndik7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtydW50aW1lRW52LldCX0VOVn0sIE5PREVfRU5WOiAke3J1bnRpbWVFbnYuTk9ERV9FTlZ9YCk7XG4gIH1cblxuICAvLyBXaGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBmb3JjZXMgYSBtb2RlICgtLWNhc2NhZGUtZW52IC8gLS1jYXNjYWRlLW5vZGUtZW52IC8gYW4gZXhwb3J0ZWRcbiAgLy8gV0JfRU5WKSwgdmFsdWVzIHRoYXQgdGhlIG1vZGUncyBvd24gZm5veCBwcm9maWxlIGRlZmluZXMgbXVzdCB3aW4gb3ZlciB2YXJpYWJsZXMgaW5oZXJpdGVkXG4gIC8vIGZyb20gdGhlIHBhcmVudCBzaGVsbDogYSBzdGFsZSBgZXhwb3J0IERBVEFCQVNFX1VSTD0uLi5gIGZyb20gYSBkZXZlbG9wbWVudCBzaGVsbCBtdXN0IG5vdFxuICAvLyBsZWFrIGludG8gYHdiIHRlc3RgJ3MgdGVzdCBtb2RlIChjZi4gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTMwKS4gT24gQ0lcbiAgLy8gdGhlIGluaGVyaXRlZCB2YXJpYWJsZXMga2VlcCB3aW5uaW5nIOKAlCB3b3JrZmxvd3MgZGVsaWJlcmF0ZWx5IGluamVjdCBlbnYgdmFycyB0aGF0IG92ZXJyaWRlXG4gIC8vIHRoZSBjb21taXR0ZWQgdmFsdWVzIOKAlCBhbmQgdGhhdCBzaGFkb3dpbmcgaXMgdGhlIGRlc2lnbmVkIGJlaGF2aW9yLlxuICBjb25zdCBtb2RlSXNGb3JjZWQgPSBCb29sZWFuKFxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52ID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogYXJndi5hdXRvQ2FzY2FkZUVudiA/IHJ1bnRpbWVFbnYuV0JfRU5WIDogdW5kZWZpbmVkKVxuICApO1xuICBjb25zdCBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBtb2RlSXNGb3JjZWQgJiYgIWlzQ0lFbnZpcm9ubWVudChydW50aW1lRW52LkNJKTtcblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgcHJvamVjdEhhc0Zub3hDb25maWcgPSBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpO1xuICBjb25zdCBbZm5veEVudlZhcnMsIGZub3hFbnZWYXJOYW1lc10gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52LFxuICAgIGhhc0Zub3hDb25maWc6IHByb2plY3RIYXNGbm94Q29uZmlnLFxuICB9KTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBmbm94RW52VmFycyk7XG4gIC8vIFJlcG9ydCB0aGUgZm5veCBzb3VyY2Ugd2hlbmV2ZXIgZm5veC50b21sIGV4aXN0cyDigJQgZXZlbiB3aGVuIGl0IHlpZWxkcyBubyBrZXlzIChhbGwgc2hhZG93ZWQsXG4gIC8vIGVtcHR5IHByb2ZpbGUsIG9yIGEgZmFpbGluZyBleHBvcnQpOiBjb25zdW1lcnMgc3VjaCBhcyB3YidzIHJlcXVpcmVkLWVudmlyb25tZW50IHZhbGlkYXRpb25cbiAgLy8gbXVzdCBzZWUgdGhhdCBhIGRlY2xhcmVkIGVudiBzb3VyY2UgZXhpc3RzIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgb3Blbi5cbiAgaWYgKGZub3hFbnZWYXJOYW1lcy5sZW5ndGggPiAwIHx8IHByb2plY3RIYXNGbm94Q29uZmlnKSB7XG4gICAgY29uc3QgZm5veFNvdXJjZU5hbWUgPSBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpO1xuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtmbm94U291cmNlTmFtZSwgZm5veEVudlZhck5hbWVzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2Zub3hFbnZWYXJOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7Zm5veFNvdXJjZU5hbWV9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaXNlRW52VmFycywgbWlzZUVudlZhck5hbWVzXSA9IHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBjYXNjYWRlLCBlbnZWYXJzLCBvcHRpb25zKTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBtaXNlRW52VmFycyk7XG4gIGlmIChtaXNlRW52VmFyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1pc2VTb3VyY2VOYW1lID0gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKTtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbbWlzZVNvdXJjZU5hbWUsIG1pc2VFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHttaXNlRW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke21pc2VTb3VyY2VOYW1lfWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgc291cmNlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBhbmQgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBsaXZlIGVudmlyb25tZW50IGZvciBrZXlzIE5PVCBsb2FkZWQgZnJvbSBmaWxlcywgc28gdGhhdCBhXG4gIC8vIHJlZmVyZW5jZSB0byBhbiBleHBvcnRlZCBrZXkgKGV4Y2x1ZGVkIGZyb20gZW52VmFycyBieSBwcm9jZXNzLWVudiBwcmVjZWRlbmNlKSByZXNvbHZlcyB0b1xuICAvLyB0aGUgZWZmZWN0aXZlIHZhbHVlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLiBMb2FkZWQga2V5cyBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tXG4gIC8vIHRoZSByZWZlcmVuY2Ugc2V0OiBkb3RlbnYtZXhwYW5kIHdvdWxkIG90aGVyd2lzZSByZXBsYWNlIHRoZWlyIHBhcnNlZCB2YWx1ZXMgd2l0aCB0aGVcbiAgLy8gcHJvY2VzcyB2YWx1ZXMsIGJyZWFraW5nIGNhbGxlcnMgdGhhdCBuZWVkIHRoZSBmaWxlLWRlZmluZWQgdmFsdWVzIHRoZW1zZWx2ZXMuXG4gIGNvbnN0IHJlZmVyZW5jZUVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAvLyBFc2NhcGUgZG9sbGFyIHNpZ25zIHNvIGRvdGVudi1leHBhbmQgc3Vic3RpdHV0ZXMgZXhwb3J0ZWQgdmFsdWVzIGxpdGVyYWxseSBpbnN0ZWFkIG9mXG4gICAgLy8gcmVjdXJzaXZlbHkgcmUtZXhwYW5kaW5nIHRoZW0gKGFuIGV4cG9ydGVkIGBwYSR3b3JkYCBtdXN0IHN0YXkgYHBhJHdvcmRgKS5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBlbnZWYXJzKSkgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgfVxuICAvLyBkb3RlbnYtZXhwYW5kIHJlc29sdmVzIHJlZmVyZW5jZXMgaW4ga2V5LWluc2VydGlvbiBvcmRlciwgc28gYSBmbm94IHZhbHVlIHJlZmVyZW5jaW5nIGFcbiAgLy8gbWlzZS1wcm92aWRlZCBrZXkgd291bGQgc2VlIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbWlzZSBlbnRyaWVzIHN0YXllZCBhcHBlbmRlZCBhZnRlciB0aGVcbiAgLy8gZm5veCBlbnRyaWVzLiBSZWJ1aWxkIHRoZSBleHBhbnNpb24gaW5wdXQgd2l0aCB0aGUgbG93ZXItcHJpb3JpdHkgc291cmNlcyBmaXJzdDsgdGhlIHZhbHVlc1xuICAvLyB0aGVtc2VsdmVzIGFscmVhZHkgcmVmbGVjdCB0aGUgaW50ZW5kZWQgZm5veC1vdmVyLW1pc2UgcHJlY2VkZW5jZS5cbiAgY29uc3Qgb3JkZXJlZEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWy4uLm1pc2VFbnZWYXJOYW1lcywgLi4uZm5veEVudlZhck5hbWVzXSkgb3JkZXJlZEVudlZhcnNba2V5XSA9IGVudlZhcnNba2V5XSE7XG4gIE9iamVjdC5hc3NpZ24ob3JkZXJlZEVudlZhcnMsIGVudlZhcnMpO1xuICAvLyBleHBhbmQoKSBtdXRhdGVzIEJPVEggaXRzIHBhcnNlZCBpbnB1dCBBTkQgcHJvY2Vzc0VudiAoZG90ZW52LWV4cGFuZCB3cml0ZXMgZXZlcnkgcGFyc2VkXG4gIC8vIHJlc3VsdCBpbnRvIHByb2Nlc3NFbnYpLCBzbyBzbmFwc2hvdCBib3RoIGZvciB0aGUgcmUtZXhwYW5zaW9uIGJlbG93IOKAlCB0aGUgcmV0cnkgbXVzdCBub3RcbiAgLy8gc2VlIHRoZSBmaXJzdCBwYXNzJ3Mgc3RhbGUgZGVwZW5kZW50IHZhbHVlcy5cbiAgY29uc3QgcHJlRXhwYW5zaW9uRW52VmFycyA9IHsgLi4ub3JkZXJlZEVudlZhcnMgfTtcbiAgY29uc3QgcHJpc3RpbmVSZWZlcmVuY2VFbnYgPSB7IC4uLnJlZmVyZW5jZUVudiB9O1xuICBsZXQgZXhwYW5kZWRFbnZWYXJzID0gZXhwYW5kKHsgcGFyc2VkOiBvcmRlcmVkRW52VmFycywgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBvcmRlcmVkRW52VmFycztcbiAgLy8gQSB2YWx1ZSByZWZlcmVuY2luZyAke1dCX0VOVn0gbXVzdCBleHBhbmQgdG8gd2hhdCB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWU6IHdoZW4gdGhlXG4gIC8vIEVGRkVDVElWRSBXQl9FTlYgZW5kcyB1cCBlbXB0eSDigJQgd2hldGhlciBpdCB3YXMgbmV2ZXIgZGVmaW5lZCwgZGVmaW5lZCBlbXB0eSwgb3IgZW1wdGllZCBieVxuICAvLyB0aGUgZXhwYW5zaW9uIGl0c2VsZiAoZS5nLiBgV0JfRU5WPSR7TUlTU0lOR19NT0RFfWApIOKAlCB3YidzIFByb2plY3QuZW52IGxhdGVyIGZpbGxzIGl0IHdpdGhcbiAgLy8gdGhlIGZhbGxiYWNrIG1vZGUsIHNvIHJlLWV4cGFuZCBmcm9tIHRoZSBvcmlnaW5hbCB2YWx1ZXMgd2l0aCB0aGF0IGZhbGxiYWNrIGF2YWlsYWJsZS5cbiAgLy8gT3B0LWluIHZpYSB0aGUgb3B0aW9uOiBhIGRpcmVjdCByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMvcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgLy8gY2FsbGVyIG5ldmVyIHJlY2VpdmVzIHRoZSBjb21wbGV0ZWQgV0JfRU5WLCBhbmQgZXhwYW5kaW5nIHJlZmVyZW5jZXMgYWdhaW5zdCBhIHZhbHVlIHRoYXQgaXNcbiAgLy8gbm90IGFjdHVhbGx5IGFwcGxpZWQgd291bGQgbWFrZSB0aGUgcGFpciBpbmNvbnNpc3RlbnQuXG4gIC8vIFRoZSBsb2FkZWQga2V5IG1hc2tzIHRoZSBhbWJpZW50IHZhbHVlLCBzbyBhIGxvYWRlZC1idXQtZW1wdGllZCBXQl9FTlYgbmVlZHMgdGhlIHJldHJ5IGV2ZW5cbiAgLy8gd2hlbiBhbiBleHBvcnRlZCBXQl9FTlYgZXhpc3RzIChhIGZvcmNlZCBtb2RlIGZpbGUgb3ZlcnJpZGVzIHRoZSBleHBvcnQgbG9jYWxseSk6IHJldHJ5IHdpdGhcbiAgLy8gdGhlIHZhbHVlIHRoZSBtZXJnZWQgZW52aXJvbm1lbnQgd2lsbCB1bHRpbWF0ZWx5IHJldGFpbi5cbiAgY29uc3QgZWZmZWN0aXZlV2JFbnYgPSBleHBhbmRlZEVudlZhcnMuV0JfRU5WID8/IHJ1bnRpbWVFbnYuV0JfRU5WO1xuICBpZiAob3B0aW9ucz8uZXhwYW5kRmFsbGJhY2tXYkVudiAmJiAhZWZmZWN0aXZlV2JFbnYpIHtcbiAgICBjb25zdCByZUV4cGFuc2lvbklucHV0ID0geyAuLi5wcmVFeHBhbnNpb25FbnZWYXJzIH07XG4gICAgZGVsZXRlIHJlRXhwYW5zaW9uSW5wdXQuV0JfRU5WO1xuICAgIGNvbnN0IHJldHJ5UmVmZXJlbmNlRW52ID0geyAuLi5wcmlzdGluZVJlZmVyZW5jZUVudiwgV0JfRU5WOiBydW50aW1lRW52LldCX0VOViB8fCByZXNvbHZlRmFsbGJhY2tXYkVudihhcmd2KSB9O1xuICAgIGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogcmVFeHBhbnNpb25JbnB1dCwgcHJvY2Vzc0VudjogcmV0cnlSZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IHJlRXhwYW5zaW9uSW5wdXQ7XG4gIH1cbiAgcmV0dXJuIFtleHBhbmRlZEVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIGZub3ggY29uZmlndXJhdGlvbiAoYGZub3gudG9tbGApLlxuICogVGhlIGJhc2UgYFtzZWNyZXRzXWAgdGFibGUgY2FycmllcyB0aGUgZGV2ZWxvcG1lbnQgdmFsdWVzLCBhbmQgYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gXG4gKiBvdmVybGF5cyBpdDsgYW4gdW5rbm93biBwcm9maWxlIGZhbGxzIGJhY2sgdG8gdGhlIGJhc2Ugc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiB7XG4gICAgaWdub3JlUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKiogUHJlY29tcHV0ZWQgaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSByZXN1bHQsIHRvIGF2b2lkIHJlLXdhbGtpbmcgdGhlIGFuY2VzdG9yIGRpcmVjdG9yaWVzLiAqL1xuICAgIGhhc0Zub3hDb25maWc/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCEob3B0aW9ucz8uaGFzRm5veENvbmZpZyA/PyBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IHNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgY2FzY2FkZSwgeyBxdWlldDogZmFsc2UgfSk7XG4gIGlmICghc2VjcmV0cykgcmV0dXJuIFt7fSwgW11dO1xuICAvLyBgW3Byb2ZpbGVzLjxjYXNjYWRlPi5zZWNyZXRzXWAgaXMgdGhlIGZub3ggYW5hbG9ndWUgb2YgYC5lbnYuPGNhc2NhZGU+YDogd2hlbiB0aGUgY2FsbGVyXG4gIC8vIGZvcmNlcyBhIG1vZGUgb2ZmIENJLCBwcm9maWxlLXNwZWNpZmljIHZhbHVlcyBtdXN0IG92ZXJyaWRlIGluaGVyaXRlZCBzaGVsbCB2YXJpYWJsZXMganVzdFxuICAvLyBsaWtlIGAuZW52Ljxtb2RlPmAgdmFsdWVzIGRvLCB3aGlsZSBiYXNlIGBbc2VjcmV0c11gIHZhbHVlcyBrZWVwIGxvc2luZyB0byBwcm9jZXNzLmVudi4gQSBrZXlcbiAgLy8gaXMgcHJvZmlsZS1zcGVjaWZpYyB3aGVuIHRoZSBwcm9maWxlIGV4cG9ydCdzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSBleHBvcnQnczsgd2hlbiB0aGVcbiAgLy8gYmFzZSBleHBvcnQgZmFpbHMsIG5vIG92ZXJyaWRlIGlzIGFwcGxpZWQgKGNvbnNlcnZhdGl2ZSkuIFRoZSBiYXNlIGV4cG9ydCBydW5zIExBWklMWSwgb25seVxuICAvLyB3aGVuIGEgcHJvY2Vzcy5lbnYgY29sbGlzaW9uIGFjdHVhbGx5IG5lZWRzIGFkanVkaWNhdGluZyDigJQgaXQgd291bGQgb3RoZXJ3aXNlIGFkZCBhXG4gIC8vIHN1YnByb2Nlc3MgKGluY2x1ZGluZyBhZ2UgZGVjcnlwdGlvbikgdG8gZXZlcnkgZm9yY2VkLW1vZGUgaW52b2NhdGlvbiBmb3Igbm90aGluZy5cbiAgbGV0IGNhY2hlZEJhc2VTZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB8IGZhbHNlID0gZmFsc2U7XG4gIGNvbnN0IGdldEJhc2VTZWNyZXRzID0gKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoY2FjaGVkQmFzZVNlY3JldHMgPT09IGZhbHNlKSB7XG4gICAgICBjYWNoZWRCYXNlU2VjcmV0cyA9IHJ1bkZub3hFeHBvcnQoY3dkLCB1bmRlZmluZWQsIHsgcXVpZXQ6IHRydWUsIGlnbm9yZVByb2ZpbGVFbnZWYXI6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRCYXNlU2VjcmV0cztcbiAgfTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbiBvdmVyIGZub3ggYmFzZSB2YWx1ZXMuXG4gICAgLy8gKFRoZSBtaXNlIHJlYWRlciBiZWxvdyBpbnRlbnRpb25hbGx5IHVzZXMgYSB2YWx1ZS1lcXVhbGl0eSBjaGVjayBpbnN0ZWFkOiBgbWlzZSBlbnZgIGVjaG9lc1xuICAgIC8vIGJhY2sgdmFyaWFibGVzIHRoZSBhbWJpZW50IG1pc2UgYWN0aXZhdGlvbiBhbHJlYWR5IGV4cG9ydGVkLCBhbmQgYSBkaWZmZXJpbmcgdmFsdWUgbWVhbnMgdGhlXG4gICAgLy8gcmVxdWVzdGVkIGNhc2NhZGUgcHJvZmlsZSBzaG91bGQgd2luIG92ZXIgdGhlIHN0YWxlIGFjdGl2YXRpb24uKVxuICAgIGlmICghb3B0aW9ucz8uaWdub3JlUHJvY2Vzc0VudiAmJiBrZXkgaW4gcHJvY2Vzcy5lbnYpIHtcbiAgICAgIGNvbnN0IGJhc2VTZWNyZXRzID0gb3B0aW9ucz8ubW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ICYmIGNhc2NhZGUgPyBnZXRCYXNlU2VjcmV0cygpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgb3ZlcnJpZGVzUHJvY2Vzc0VudiA9IGJhc2VTZWNyZXRzICE9PSB1bmRlZmluZWQgJiYgYmFzZVNlY3JldHNba2V5XSAhPT0gdmFsdWU7XG4gICAgICBpZiAoIW92ZXJyaWRlc1Byb2Nlc3NFbnYpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBydW5Gbm94RXhwb3J0KFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiB7IHF1aWV0OiBib29sZWFuOyBpZ25vcmVQcm9maWxlRW52VmFyPzogYm9vbGVhbiB9XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgIChkZWZhdWx0KTogZm5veCBvdGhlcndpc2UgZXhpdHMgMCBhbmQgc2lsZW50bHkgb21pdHMgc2VjcmV0cyBpdCBmYWlscyB0b1xuICAvLyByZXNvbHZlIChlLmcuIGEgbWlzc2luZyBhZ2Uga2V5KSwgd2hpY2ggd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIHNlY3JldHMuXG4gIC8vIE9wdC1pbiBlc2NhcGUgaGF0Y2ggYFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUz0xYDogc3dpdGNoIHRvIGB3YXJuYCBzbyBhIGtleWxlc3MgY29udGV4dCDigJQgZS5nLiBhXG4gIC8vIERvY2tlci9SYWlsd2F5IGltYWdlIGJ1aWxkIHRoYXQgb25seSBpbmxpbmVzIG5vbi1zZWNyZXQgcHVibGljIHZhbHVlcyAoYEFQUF9USVRMRWAsXG4gIC8vIGBORVhUX1BVQkxJQ18qYCkgd2hpbGUgdGhlIGFnZSBrZXkgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCDigJQgc3RpbGwgbG9hZHMgdGhlIHJlc29sdmFibGUgdmFsdWVzXG4gIC8vIChwbGFpbnRleHQgZGVmYXVsdHMgcGx1cyBhbnkgc2VjcmV0IHRoYXQgRElEIGRlY3J5cHQpIGluc3RlYWQgb2YgZmFpbGluZyBvdXRyaWdodC4gYHdhcm5gLCBub3RcbiAgLy8gYGlnbm9yZWAsIGtlZXBzIGZub3ggcmVwb3J0aW5nIHRoZSBza2lwcGVkIHNlY3JldCBuYW1lcyBvbiBzdGRlcnIgKHN1cmZhY2VkIGJlbG93KSwgc28gcmVsYXhpbmdcbiAgLy8gdGhlIGNoZWNrIHN0YXlzIGF1ZGl0YWJsZSByYXRoZXIgdGhhbiBzaWxlbnRseSBkcm9wcGluZyBkZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBgLS1ub24taW50ZXJhY3RpdmVgOiBwcm9tcHRzIG9yIGJyb3dzZXIgYXV0aCBmbG93cyB3b3VsZCBoYW5nIGZvcmV2ZXIgYmVjYXVzZSBzdGRpbiBpcyBpZ25vcmVkLlxuICBjb25zdCBhbGxvd01pc3NpbmdTZWNyZXRzID1cbiAgICBwcm9jZXNzLmVudi5XQl9BTExPV19NSVNTSU5HX1NFQ1JFVFMgPT09ICcxJyB8fCBwcm9jZXNzLmVudi5XQl9BTExPV19NSVNTSU5HX1NFQ1JFVFMgPT09ICd0cnVlJztcbiAgY29uc3QgYXJncyA9IFtcbiAgICAnZXhwb3J0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1uby1jb2xvcicsXG4gICAgJy0taWYtbWlzc2luZycsXG4gICAgYWxsb3dNaXNzaW5nU2VjcmV0cyA/ICd3YXJuJyA6ICdlcnJvcicsXG4gICAgJy0tbm9uLWludGVyYWN0aXZlJyxcbiAgXTtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1wcm9maWxlJywgY2FzY2FkZSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaWdub3JlUHJvZmlsZUVudlZhcikge1xuICAgIC8vIFdpdGhvdXQgYC0tcHJvZmlsZWAsIGZub3ggZmFsbHMgYmFjayB0byBGTk9YX1BST0ZJTEU7IHRoZSBiYXNlLWFkanVkaWNhdGlvbiBleHBvcnQgbXVzdFxuICAgIC8vIHJlYWQgdGhlIEJBU0Ugc2VjcmV0cywgc28gdGhlIGluaGVyaXRlZCBwcm9maWxlIHNlbGVjdGlvbiBpcyBjbGVhcmVkIGZvciBpdCDigJQgYW5kIG9ubHkgZm9yXG4gICAgLy8gaXQuIEEgUFJJTUFSWSBleHBvcnQgc3RpbGwgaG9ub3JzIEZOT1hfUFJPRklMRTogaXQgZWl0aGVyIHN0YXlzIHByb2ZpbGUtbGVzcyAoZm5veCByZWFkcyB0aGVcbiAgICAvLyB2YXJpYWJsZSkgb3IgZm9sZHMgaXQgaW50byB0aGUgYC0tcHJvZmlsZWAgaXQgcGFzc2VzIChzZWUgd2IgZG90ZW52J3MgY2FzY2FkZSkuXG4gICAgZGVsZXRlIGVudi5GTk9YX1BST0ZJTEU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnZm5veCcsIGFyZ3MsIHtcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHtcbiAgICAvLyBUaGUgcmVwb3NpdG9yeSBkZWNsYXJlcyBmbm94LW1hbmFnZWQgc2VjcmV0cyAoZm5veC50b21sIGV4aXN0cyksIHNvIGEgZmFpbGluZyBleHBvcnQgbXVzdCBiZVxuICAgIC8vIHN1cmZhY2VkOiBzd2FsbG93aW5nIGl0IHdvdWxkIG1ha2UgZGVjbGFyZWQgc2VjcmV0cyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHVuZGVjbGFyZWQgb25lcy5cbiAgICBpZiAoIW9wdGlvbnMucXVpZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGZub3ggc2VjcmV0czogJHtyZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzdWx0LnN0ZGVycj8udHJpbSgpIHx8IGBmbm94IGV4aXRlZCB3aXRoIHN0YXR1cyAke3Jlc3VsdC5zdGF0dXN9YH1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWxsb3dNaXNzaW5nU2VjcmV0cyAmJiAhb3B0aW9ucy5xdWlldCAmJiByZXN1bHQuc3RkZXJyPy50cmltKCkpIHtcbiAgICAvLyBXaXRoIGAtLWlmLW1pc3Npbmcgd2FybmAsIGZub3ggZXhpdHMgMCBidXQgcmVwb3J0cyB0aGUgc2VjcmV0cyBpdCBjb3VsZCBub3QgcmVzb2x2ZSBvbiBzdGRlcnIuXG4gICAgLy8gU3VyZmFjZSB0aGVtIHNvIHJlbGF4aW5nIHRoZSBjaGVjayB2aWEgV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTIGRvZXMgbm90IGhpZGUgYSByZWFsIGdhcC5cbiAgICBjb25zb2xlLndhcm4oYFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUzogY29udGludWluZyB3aXRob3V0IHVucmVzb2x2ZWQgZm5veCBzZWNyZXRzLlxcbiR7cmVzdWx0LnN0ZGVyci50cmltKCl9YCk7XG4gIH1cblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzZWNyZXRzID0gKHBhcnNlZCBhcyB7IHNlY3JldHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5zZWNyZXRzO1xuICBpZiAoIXNlY3JldHMgfHwgdHlwZW9mIHNlY3JldHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2VjcmV0cykpIHJldHVybjtcbiAgcmV0dXJuIHNlY3JldHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZCwgWydmbm94LnRvbWwnXSk7XG59XG5cbmZ1bmN0aW9uIGZub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhc2NhZGUgPyBgZm5veCBleHBvcnQgLS1wcm9maWxlICR7Y2FzY2FkZX1gIDogJ2Zub3ggZXhwb3J0Jztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3VycmVudEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9wdGlvbnM/OiB7IGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzdHJpbmdbXV0ge1xuICBpZiAoIWhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBhcmdzID0gWydlbnYnLCAnLS1qc29uJywgJy0tY2QnLCBjd2RdO1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1lbnYnLCBjYXNjYWRlKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgYXJncywge1xuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHJldHVybiBbe30sIFtdXTtcblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbe30sIFtdXTtcbiAgfVxuICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBrZXkgaW4gY3VycmVudEVudlZhcnMpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52KSB7XG4gICAgICAvLyBgbWlzZSBlbnZgIGFsd2F5cyBlbWl0cyBQQVRIIGR1ZSB0byB0b29sIHNoaW1zOyBjb25zdW1lcnMgb2YgZmlsZS1kZWZpbmVkIHZhcmlhYmxlc1xuICAgICAgLy8gKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApIG11c3Qgbm90IHByb3BhZ2F0ZSBpdC5cbiAgICAgIGlmIChrZXkgPT09ICdQQVRIJykgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBbZW52VmFycywga2V5c107XG59XG5cbmZ1bmN0aW9uIGhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNBbmNlc3RvckNvbnRhaW5pbmcoY3dkLCBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pO1xufVxuXG5mdW5jdGlvbiBoYXNBbmNlc3RvckNvbnRhaW5pbmcoY3dkOiBzdHJpbmcsIGZpbGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBpZiAoZmlsZU5hbWVzLnNvbWUoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgZmlsZU5hbWUpKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZnVuY3Rpb24gaXNDSUVudmlyb25tZW50KGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGZub3gvbWlzZSBhbmQgYXNzaWducyB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIC8vIEV4aXN0aW5nIHByb2Nlc3MuZW52IGtleXMgYXJlIGtlcHQ6IGVudlZhcnMgbWF5IGRlbGliZXJhdGVseSBjb250YWluIGRpZmZlcmluZyB2YWx1ZXMgdGhhdFxuICAgIC8vIG11c3Qgd2luIG9ubHkgaW4gdGhlIHJldHVybmVkIHJlY29yZCAobWlzZSBjYXNjYWRlLXByb2ZpbGUgdmFsdWVzLCBmb3JjZWQtbW9kZSBvdmVycmlkZXNcbiAgICAvLyBjb25zdW1lZCB2aWEgYHByb2plY3QuZW52YCksIG5ldmVyIGNsb2JiZXIgdGhlIGNhbGxlcidzIG93biBwcm9jZXNzIGVudmlyb25tZW50LlxuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBibGFuay1vbmx5IGxpbmVzIGFyZSBza2lwcGVkIHdoaWxlIHByaW50aW5nIHN0ZG91dC9zdGRlcnIgaW4gcmVhbHRpbWUgKi9cbiAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGNvbnN0IHN0ZG91dFByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRvdXQsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBjb25zdCBzdGRlcnJQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3RkZXJyLCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgc3Rkb3V0UHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgc3RkZXJyUHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBzdGRvdXRQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIHN0ZGVyclByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFsdGltZVByaW50ZXIoXG4gIHN0cmVhbTogTm9kZUpTLldyaXRlU3RyZWFtLFxuICBvbWl0QmxhbmtMaW5lcyA9IGZhbHNlXG4pOiB7IHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkOyBmbHVzaDogKCkgPT4gdm9pZCB9IHtcbiAgaWYgKCFvbWl0QmxhbmtMaW5lcykge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogKGRhdGEpID0+IHN0cmVhbS53cml0ZShkYXRhKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB7fSxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBlbmRpbmcgPSAnJztcbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmcgKz0gZGF0YTtcbiAgICAgIGNvbnN0IGxpbmVzID0gcGVuZGluZy5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpID8/ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghaXNCbGFua0xpbmUobGluZSkpIHtcbiAgICAgICAgICBzdHJlYW0ud3JpdGUoYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmICghaXNCbGFua0xpbmUocGVuZGluZykpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcGVuZGluZyA9ICcnO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmxhbmtMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbiIsImNvbnN0IGJvb2xlYW5PcHRpb25OYW1lcyA9IG5ldyBTZXQoW1xuICAnYXV0by1jYXNjYWRlLWVudicsXG4gICdjYXNjYWRlLW5vZGUtZW52JyxcbiAgJ2RyeS1ydW4nLFxuICAnZHJ5JyxcbiAgJ2QnLFxuICAnaGVscCcsXG4gICdoJyxcbiAgJ3F1aWV0LWVudicsXG4gICd2ZXJib3NlJyxcbiAgJ3YnLFxuICAndmVyc2lvbicsXG5dKTtcbmNvbnN0IHZhbHVlT3B0aW9uTmFtZXMgPSBuZXcgU2V0KFsnY2FzY2FkZS1lbnYnLCAnd29ya2luZy1kaXInLCAndyddKTtcbmNvbnN0IGJvdW5kYXJ5TWFya2VyRW52TmFtZSA9ICdXQl9JTlRFUk5BTF9SVU5fQk9VTkRBUllfTUFSS0VSJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3RlY3RSdW5TY3JpcHRBcmdzKGFyZ3YpIHtcbiAgY29uc3QgcnVuSW5kZXggPSBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KTtcbiAgaWYgKHJ1bkluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNjcmlwdEluZGV4ID0gZmluZFJ1blNjcmlwdEluZGV4KGFyZ3YsIHJ1bkluZGV4ICsgMSk7XG4gIGlmIChzY3JpcHRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGFyZ3Zbc2NyaXB0SW5kZXggLSAxXSA9PT0gJy0tJykgcmV0dXJuO1xuXG4gIGNvbnN0IGV4aXN0aW5nTWFya2VyID0gcHJvY2Vzcy5lbnZbYm91bmRhcnlNYXJrZXJFbnZOYW1lXTtcbiAgaWYgKGFyZ3Zbc2NyaXB0SW5kZXggKyAxXSA9PT0gJy0tJykge1xuICAgIGlmIChleGlzdGluZ01hcmtlciAmJiBhcmd2W3NjcmlwdEluZGV4ICsgMl0gPT09IGV4aXN0aW5nTWFya2VyKSByZXR1cm47XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG1hcmtlcjtcbiAgZG8gbWFya2VyID0gYF9fV0JfUlVOX1NDUklQVF9BUkdTXyR7cmFuZG9tVVVJRCgpfV9fYDtcbiAgd2hpbGUgKGFyZ3YuaW5jbHVkZXMobWFya2VyKSk7XG4gIHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV0gPSBtYXJrZXI7XG4gIGFyZ3Yuc3BsaWNlKHNjcmlwdEluZGV4ICsgMSwgMCwgJy0tJywgbWFya2VyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1blNjcmlwdEFyZ3MoYXJndikge1xuICBjb25zdCBydW5JbmRleCA9IGZpbmRUb3BMZXZlbFJ1bkluZGV4KGFyZ3YpO1xuICBpZiAocnVuSW5kZXggPT09IC0xKSByZXR1cm4gW107XG4gIGNvbnN0IHNjcmlwdEluZGV4ID0gZmluZFJ1blNjcmlwdEluZGV4KGFyZ3YsIHJ1bkluZGV4ICsgMSk7XG4gIGlmIChzY3JpcHRJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG5cbiAgY29uc3QgYXJncyA9IGFyZ3Yuc2xpY2Uoc2NyaXB0SW5kZXgpO1xuICBjb25zdCBtYXJrZXIgPSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICBpZiAobWFya2VyICYmIGFyZ3NbMV0gPT09ICctLScgJiYgYXJnc1syXSA9PT0gbWFya2VyKSBhcmdzLnNwbGljZSgxLCAyKTtcbiAgZGVsZXRlIHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KSB7XG4gIGZvciAobGV0IGluZGV4ID0gMjsgaW5kZXggPCBhcmd2Lmxlbmd0aDsgKSB7XG4gICAgY29uc3QgY29uc3VtZWQgPSBjb3VudE9wdGlvblRva2Vucyhhcmd2LCBpbmRleCk7XG4gICAgaWYgKGNvbnN1bWVkID09PSAwKSByZXR1cm4gYXJndltpbmRleF0gPT09ICdydW4nID8gaW5kZXggOiAtMTtcbiAgICBpbmRleCArPSBjb25zdW1lZDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBzdGFydEluZGV4KSB7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBhcmd2Lmxlbmd0aDsgKSB7XG4gICAgaWYgKGFyZ3ZbaW5kZXhdID09PSAnLS0nKSByZXR1cm4gYXJndltpbmRleCArIDFdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBpbmRleCArIDE7XG4gICAgY29uc3QgY29uc3VtZWQgPSBjb3VudE9wdGlvblRva2Vucyhhcmd2LCBpbmRleCk7XG4gICAgaWYgKGNvbnN1bWVkID09PSAwKSByZXR1cm4gaW5kZXg7XG4gICAgaW5kZXggKz0gY29uc3VtZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpIHtcbiAgY29uc3QgYXJnID0gYXJndltpbmRleF07XG4gIGlmICghYXJnPy5zdGFydHNXaXRoKCctJykgfHwgYXJnID09PSAnLScpIHJldHVybiAwO1xuICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICBjb25zdCBvcHRpb25UZXh0ID0gYXJnLnNsaWNlKDIpO1xuICAgIGNvbnN0IGVxdWFsc0luZGV4ID0gb3B0aW9uVGV4dC5pbmRleE9mKCc9Jyk7XG4gICAgY29uc3QgcmF3TmFtZSA9IGVxdWFsc0luZGV4ID09PSAtMSA/IG9wdGlvblRleHQgOiBvcHRpb25UZXh0LnNsaWNlKDAsIGVxdWFsc0luZGV4KTtcbiAgICBjb25zdCBuYW1lID0gcmF3TmFtZS5zdGFydHNXaXRoKCduby0nKSA/IHJhd05hbWUuc2xpY2UoMykgOiByYXdOYW1lO1xuICAgIGlmIChib29sZWFuT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXF1YWxzSW5kZXggPT09IC0xICYmIGlzQm9vbGVhbkxpdGVyYWwoYXJndltpbmRleCArIDFdKSA/IDIgOiAxO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSByZXR1cm4gMDtcbiAgICByZXR1cm4gZXF1YWxzSW5kZXggPT09IC0xID8gMiA6IDE7XG4gIH1cblxuICBjb25zdCBzaG9ydE9wdGlvbnMgPSBhcmcuc2xpY2UoMSk7XG4gIGlmICgvXltkaHZdPShmYWxzZXx0cnVlKSQvLnRlc3Qoc2hvcnRPcHRpb25zKSkgcmV0dXJuIDE7XG4gIGlmICgvXltkaHZdJC8udGVzdChzaG9ydE9wdGlvbnMpICYmIGlzQm9vbGVhbkxpdGVyYWwoYXJndltpbmRleCArIDFdKSkgcmV0dXJuIDI7XG4gIGZvciAobGV0IG9wdGlvbkluZGV4ID0gMDsgb3B0aW9uSW5kZXggPCBzaG9ydE9wdGlvbnMubGVuZ3RoOyBvcHRpb25JbmRleCsrKSB7XG4gICAgY29uc3QgbmFtZSA9IHNob3J0T3B0aW9uc1tvcHRpb25JbmRleF07XG4gICAgaWYgKGJvb2xlYW5PcHRpb25OYW1lcy5oYXMobmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmICh2YWx1ZU9wdGlvbk5hbWVzLmhhcyhuYW1lKSkgcmV0dXJuIG9wdGlvbkluZGV4ICsgMSA8IHNob3J0T3B0aW9ucy5sZW5ndGggPyAxIDogMjtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuTGl0ZXJhbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJztcbn1cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4qIEEgU0hBMy01MTIgaW1wbGVtZW50YXRpb24gc3BlY2lhbGl6ZWQgYW5kIG9wdGltaXplZCBmcm9tXG4qIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9ICh2ZXJzaW9uIDAuOS4zKS5cbipcbiogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiogQGxpY2Vuc2UgTUlUXG4qL1xuY29uc3QgZT1BcnJheS5mcm9tKHtsZW5ndGg6MjU2fSwoZSx0KT0+dC50b1N0cmluZygxNikucGFkU3RhcnQoMixgMGApKSx0PW5ldyBJbnQzMkFycmF5KFsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XSksbj1uZXcgSW50MzJBcnJheSg1MCkscj1uZXcgSW50MzJBcnJheSgxOCksaT1uZXcgVGV4dEVuY29kZXI7bGV0IGE9bmV3IFVpbnQ4QXJyYXkoNDA5Niksbz1uZXcgVWludDMyQXJyYXkoYS5idWZmZXIpO2NvbnN0IGVlPW5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMV0pLmJ1ZmZlcilbMF09PT0xO2Z1bmN0aW9uIHModCl7bGV0IHM9dC5sZW5ndGgqMyxsPWEsdT1vO2lmKGwubGVuZ3RoPHMpe2xldCBlPWwubGVuZ3RoKjI7Zm9yKDtlPHM7KWUqPTI7bD1uZXcgVWludDhBcnJheShlKSx1PW5ldyBVaW50MzJBcnJheShsLmJ1ZmZlciksZTw9MTA0ODU3NiYmKGE9bCxvPXUpfWxldCBkPWkuZW5jb2RlSW50byh0LGwpLndyaXR0ZW4sZj1uO2YuZmlsbCgwKTtsZXQgcD0wO2lmKGVlKXtsZXQgZT0wO2Zvcig7ZC1wPj03Mjspe2ZvcihsZXQgdD0wO3Q8MTg7dCsrKWZbdF09Zlt0XV51W2UrdF07YyhmKSxlKz0xOCxwKz03Mn19ZWxzZSBmb3IoO2QtcD49NzI7KXtmb3IobGV0IGU9MDtlPDE4O2UrKyl7bGV0IHQ9cCsoZTw8Mik7ZltlXT1mW2VdXihsW3RdfGxbdCsxXTw8OHxsW3QrMl08PDE2fGxbdCszXTw8MjQpfWMoZikscCs9NzJ9bGV0IG09cjttLmZpbGwoMCk7Zm9yKGxldCBlPXA7ZTxkO2UrKyl7bGV0IHQ9ZS1wO21bdD4+Ml09bVt0Pj4yXXxsW2VdPDwoKHQmMyk8PDMpfWxldCBoPWQtcDttW2g+PjJdPW1baD4+Ml18Njw8KChoJjMpPDwzKSxtWzE3XXw9MjE0NzQ4MzY0ODtmb3IobGV0IGU9MDtlPDE4O2UrKylmW2VdPWZbZV1ebVtlXTtjKGYpO2xldCBnPWBgO2ZvcihsZXQgdD0wO3Q8MTY7dCs9NCl7bGV0IG49Zlt0XSxyPWZbdCsxXSxpPWZbdCsyXSxhPWZbdCszXTtnKz1lW24mMjU1XStlW24+PjgmMjU1XStlW24+PjE2JjI1NV0rZVtuPj4+MjRdK2VbciYyNTVdK2Vbcj4+OCYyNTVdK2Vbcj4+MTYmMjU1XStlW3I+Pj4yNF0rZVtpJjI1NV0rZVtpPj44JjI1NV0rZVtpPj4xNiYyNTVdK2VbaT4+PjI0XStlW2EmMjU1XStlW2E+PjgmMjU1XStlW2E+PjE2JjI1NV0rZVthPj4+MjRdfXJldHVybiBnfWZ1bmN0aW9uIGMoZSl7bGV0IG4scixpLGEsbyxlZSxzLGMsbCx1LGQsZixwLG0saCxnLHRlLG5lLHJlLGllLGFlLG9lLHNlLGNlLGxlLHVlLGRlLGZlLHBlLG1lLGhlLGdlLF9lLHZlLHllLGJlLHhlLFNlLENlLHdlLFRlLEVlLERlLE9lLGtlLEFlLGplLE1lLE5lLFBlLEZlLEllLExlLFJlLHplLEJlLFZlLEhlLFVlLFdlLEdlLEtlLHFlLF89ZVswXSx2PWVbMV0seT1lWzJdLEplPWVbM10sYj1lWzRdLHg9ZVs1XSxTPWVbNl0sQz1lWzddLHc9ZVs4XSxUPWVbOV0sRT1lWzEwXSxEPWVbMTFdLE89ZVsxMl0saz1lWzEzXSxBPWVbMTRdLGo9ZVsxNV0sTT1lWzE2XSxOPWVbMTddLFA9ZVsxOF0sRj1lWzE5XSxJPWVbMjBdLEw9ZVsyMV0sUj1lWzIyXSx6PWVbMjNdLEI9ZVsyNF0sVj1lWzI1XSxIPWVbMjZdLFU9ZVsyN10sVz1lWzI4XSxHPWVbMjldLEs9ZVszMF0scT1lWzMxXSxKPWVbMzJdLFk9ZVszM10sWD1lWzM0XSxaPWVbMzVdLFE9ZVszNl0sJD1lWzM3XSxZZT1lWzM4XSxYZT1lWzM5XSxaZT1lWzQwXSxRZT1lWzQxXSwkZT1lWzQyXSxldD1lWzQzXSx0dD1lWzQ0XSxudD1lWzQ1XSxydD1lWzQ2XSxpdD1lWzQ3XSxhdD1lWzQ4XSxvdD1lWzQ5XTtmb3IoaT0wO2k8NDg7aSs9MilhPV9eRV5JXkteWmUsbz12XkReTF5xXlFlLGVlPXleT15SXkpeJGUscz1KZV5rXnpeWV5ldCxjPWJeQV5CXlhedHQsbD14XmpeVl5aXm50LHU9U15NXkheUV5ydCxkPUNeTl5VXiReaXQsZj13XlBeV15ZZV5hdCxwPVReRl5HXlhlXm90LG49Zl4oZWU8PDF8cz4+PjMxKSxyPXBeKHM8PDF8ZWU+Pj4zMSksX149bix2Xj1yLEVePW4sRF49cixJXj1uLExePXIsS149bixxXj1yLFplXj1uLFFlXj1yLG49YV4oYzw8MXxsPj4+MzEpLHI9b14obDw8MXxjPj4+MzEpLHlePW4sSmVePXIsT149bixrXj1yLFJePW4sel49cixKXj1uLFlePXIsJGVePW4sZXRePXIsbj1lZV4odTw8MXxkPj4+MzEpLHI9c14oZDw8MXx1Pj4+MzEpLGJePW4seF49cixBXj1uLGpePXIsQl49bixWXj1yLFhePW4sWl49cix0dF49bixudF49cixuPWNeKGY8PDF8cD4+PjMxKSxyPWxeKHA8PDF8Zj4+PjMxKSxTXj1uLENePXIsTV49bixOXj1yLEhePW4sVV49cixRXj1uLCRePXIscnRePW4saXRePXIsbj11XihhPDwxfG8+Pj4zMSkscj1kXihvPDwxfGE+Pj4zMSksd149bixUXj1yLFBePW4sRl49cixXXj1uLEdePXIsWWVePW4sWGVePXIsYXRePW4sb3RePXIsbT1fLGg9dixBZT1EPDw0fEU+Pj4yOCxqZT1FPDw0fEQ+Pj4yOCxmZT1JPDwzfEw+Pj4yOSxwZT1MPDwzfEk+Pj4yOSxXZT1xPDw5fEs+Pj4yMyxHZT1LPDw5fHE+Pj4yMyxFZT1aZTw8MTh8UWU+Pj4xNCxEZT1RZTw8MTh8WmU+Pj4xNCx2ZT15PDwxfEplPj4+MzEseWU9SmU8PDF8eT4+PjMxLGc9azw8MTJ8Tz4+PjIwLHRlPU88PDEyfGs+Pj4yMCxNZT1SPDwxMHx6Pj4+MjIsTmU9ejw8MTB8Uj4+PjIyLG1lPVk8PDEzfEo+Pj4xOSxoZT1KPDwxM3xZPj4+MTksS2U9JGU8PDJ8ZXQ+Pj4zMCxxZT1ldDw8MnwkZT4+PjMwLFJlPXg8PDMwfGI+Pj4yLHplPWI8PDMwfHg+Pj4yLGJlPUE8PDZ8aj4+PjI2LHhlPWo8PDZ8QT4+PjI2LG5lPVY8PDExfEI+Pj4yMSxyZT1CPDwxMXxWPj4+MjEsUGU9WDw8MTV8Wj4+PjE3LEZlPVo8PDE1fFg+Pj4xNyxnZT1udDw8Mjl8dHQ+Pj4zLF9lPXR0PDwyOXxudD4+PjMsY2U9Uzw8Mjh8Qz4+PjQsbGU9Qzw8Mjh8Uz4+PjQsQmU9Tjw8MjN8TT4+PjksVmU9TTw8MjN8Tj4+PjksU2U9SDw8MjV8VT4+PjcsQ2U9VTw8MjV8SD4+PjcsaWU9UTw8MjF8JD4+PjExLGFlPSQ8PDIxfFE+Pj4xMSxJZT1pdDw8MjR8cnQ+Pj44LExlPXJ0PDwyNHxpdD4+PjgsT2U9dzw8Mjd8VD4+PjUsa2U9VDw8Mjd8dz4+PjUsdWU9UDw8MjB8Rj4+PjEyLGRlPUY8PDIwfFA+Pj4xMixIZT1HPDw3fFc+Pj4yNSxVZT1XPDw3fEc+Pj4yNSx3ZT1ZZTw8OHxYZT4+PjI0LFRlPVhlPDw4fFllPj4+MjQsb2U9YXQ8PDE0fG90Pj4+MTgsc2U9b3Q8PDE0fGF0Pj4+MTgsXz1tXn5nJm5lLHY9aF5+dGUmcmUsRT1jZV5+dWUmZmUsRD1sZV5+ZGUmcGUsST12ZV5+YmUmU2UsTD15ZV5+eGUmQ2UsSz1PZV5+QWUmTWUscT1rZV5+amUmTmUsWmU9UmVefkJlJkhlLFFlPXplXn5WZSZVZSx5PWdefm5lJmllLEplPXRlXn5yZSZhZSxPPXVlXn5mZSZtZSxrPWRlXn5wZSZoZSxSPWJlXn5TZSZ3ZSx6PXhlXn5DZSZUZSxKPUFlXn5NZSZQZSxZPWplXn5OZSZGZSwkZT1CZV5+SGUmV2UsZXQ9VmVeflVlJkdlLGI9bmVefmllJm9lLHg9cmVefmFlJnNlLEE9ZmVefm1lJmdlLGo9cGVefmhlJl9lLEI9U2VefndlJkVlLFY9Q2VeflRlJkRlLFg9TWVeflBlJkllLFo9TmVefkZlJkxlLHR0PUhlXn5XZSZLZSxudD1VZV5+R2UmcWUsUz1pZV5+b2UmbSxDPWFlXn5zZSZoLE09bWVefmdlJmNlLE49aGVefl9lJmxlLEg9d2VefkVlJnZlLFU9VGVefkRlJnllLFE9UGVefkllJk9lLCQ9RmVefkxlJmtlLHJ0PVdlXn5LZSZSZSxpdD1HZV5+cWUmemUsdz1vZV5+bSZnLFQ9c2VefmgmdGUsUD1nZV5+Y2UmdWUsRj1fZV5+bGUmZGUsVz1FZV5+dmUmYmUsRz1EZV5+eWUmeGUsWWU9SWVefk9lJkFlLFhlPUxlXn5rZSZqZSxhdD1LZV5+UmUmQmUsb3Q9cWVefnplJlZlLF9ePXRbaV0sdl49dFtpKzFdO2VbMF09XyxlWzFdPXYsZVsyXT15LGVbM109SmUsZVs0XT1iLGVbNV09eCxlWzZdPVMsZVs3XT1DLGVbOF09dyxlWzldPVQsZVsxMF09RSxlWzExXT1ELGVbMTJdPU8sZVsxM109ayxlWzE0XT1BLGVbMTVdPWosZVsxNl09TSxlWzE3XT1OLGVbMThdPVAsZVsxOV09RixlWzIwXT1JLGVbMjFdPUwsZVsyMl09UixlWzIzXT16LGVbMjRdPUIsZVsyNV09VixlWzI2XT1ILGVbMjddPVUsZVsyOF09VyxlWzI5XT1HLGVbMzBdPUssZVszMV09cSxlWzMyXT1KLGVbMzNdPVksZVszNF09WCxlWzM1XT1aLGVbMzZdPVEsZVszN109JCxlWzM4XT1ZZSxlWzM5XT1YZSxlWzQwXT1aZSxlWzQxXT1RZSxlWzQyXT0kZSxlWzQzXT1ldCxlWzQ0XT10dCxlWzQ1XT1udCxlWzQ2XT1ydCxlWzQ3XT1pdCxlWzQ4XT1hdCxlWzQ5XT1vdH1leHBvcnR7cyBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcCIsImNvbnN0IGU9cigpLHQ9bmV3IFRleHRFbmNvZGVyLG49bmV3IFRleHREZWNvZGVyKGB1dGYtOGApO2Z1bmN0aW9uIHIoKXtyZXR1cm4gbmV3IE1hcChbe2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2xldCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gZS5zdGFjayE9PXZvaWQgMCYmdC5wdXNoKGUuc3RhY2spLGUuY2F1c2UhPT12b2lkIDAmJihlLnN0YWNrPT09dm9pZCAwJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9PkVycm9yKCksaHlkcmF0ZTooZSxbdCxuLHIsaV0pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4scj09PXZvaWQgMD9kZWxldGUgZS5zdGFjazplLnN0YWNrPXIsaSE9PXZvaWQgMCYmKGUuY2F1c2U9aSl9fSx7aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKG4uZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT50LmVuY29kZShhdG9iKGUpKX0se2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGxldFtuLHJdb2YgdCllLnNldChuLHIpfX0se2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IobGV0IG4gb2YgdCllLmFkZChuKX19LHtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LHtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0se2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX1dLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9ZXhwb3J0e2UgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgZX1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2Z1bmN0aW9uIHQodCxuPWUpe3JldHVybiBKU09OLnN0cmluZ2lmeShyKHQsbikpfWZ1bmN0aW9uIG4oZSl7aWYoZT09PXZvaWQgMClyZXR1cm4tMTtpZih0eXBlb2YgZT09YG51bWJlcmApe2lmKE51bWJlci5pc05hTihlKSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKGUpKXJldHVybiBlPDA/LTU6LTR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcih0LHI9ZSl7bGV0IGk9bih0KTtpZihpIT09bnVsbClyZXR1cm4gaTtsZXQgYT1bXSxvPW5ldyBNYXA7cmV0dXJuIHModCksYTtmdW5jdGlvbiBzKGUpe2xldCB0PW4oZSk7aWYodCE9PW51bGwpcmV0dXJuIHQ7bGV0IGk9by5nZXQoZSk7aWYoaSE9PXZvaWQgMClyZXR1cm4gaTtzd2l0Y2goaT1hLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZWBudW1iZXJgOmNhc2Vgc3RyaW5nYDpjYXNlYGJvb2xlYW5gOmFbaV09ZSxvLnNldChlLGkpO2JyZWFrO2Nhc2VgYmlnaW50YDphW2ldPVstNixlLnRvU3RyaW5nKDE2KV0sby5zZXQoZSxpKTticmVhaztjYXNlYG9iamVjdGA6aWYoZT09PW51bGwpYVtpXT1lLG8uc2V0KGUsaSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtsZXQgdD1lLmxlbmd0aCxuPUFycmF5KHQpO2FbaV09bixvLnNldChlLGkpO2ZvcihsZXQgcj0wO3I8dDtyKyspbltyXT1zKGVbcl0pfWVsc2V7bGV0IHQ9ZS5jb25zdHJ1Y3RvcixuPXR5cGVvZiB0PT1gZnVuY3Rpb25gP3IuZ2V0KHQubmFtZSk6dm9pZCAwO2lmKG49PT12b2lkIDApe2xldCB0PU9iamVjdC5rZXlzKGUpLG49dC5sZW5ndGgscj1BcnJheShuK24rMSk7clswXT1gYCxhW2ldPXIsby5zZXQoZSxpKTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj10W2ldLGE9aStpO3JbYSsxXT1zKG4pLHJbYSsyXT1zKGVbbl0pfX1lbHNle2xldCByPW4uZnJvbShlKSxjPXIubGVuZ3RoLGw9QXJyYXkoYysxKTtsWzBdPXQubmFtZSxhW2ldPWwsby5zZXQoZSxpKTtmb3IobGV0IGU9MDtlPGM7ZSsrKWxbZSsxXT1zKHJbZV0pfX19cmV0dXJuIGl9fWV4cG9ydHt0IGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwIiwiaW1wb3J0e3NoYTNfNTEyIGFzIGV9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyB0fWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBuKG4scil7cmV0dXJuIGUodChbbixyXSkpfWZ1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdChbZSxuXSl9ZnVuY3Rpb24gaSgpe3JldHVybmBgfWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxuIGFzIGdldENhY2hlS2V5T2ZIYXNoLHIgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcCIsImltcG9ydHtnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZSxnZXRDYWNoZUtleU9mSGFzaCBhcyB0fWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPWkoe2dldENhY2hlS2V5OnR9KSxyPWkoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiBpKHtjYWNoZUR1cmF0aW9uOmU9MS8wLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LHIpe2xldCBpLGEsbztyZXR1cm4gcj8ua2luZD09PWBnZXR0ZXJgP2Z1bmN0aW9uKCl7bGV0IHI9bih0aGlzLFtdKSxzPURhdGUubm93KCk7cmV0dXJuKG8hPT1yfHxzLWE+ZSkmJihvPXIsaT10LmNhbGwodGhpcyksYT1zKSxpfTpmdW5jdGlvbiguLi5zKXtsZXQgYz1uKHRoaXMscyksbD1EYXRlLm5vdygpO3JldHVybihvIT09Y3x8bC1hPmUpJiYobz1jLGk9UmVmbGVjdC5hcHBseSh0LHI/dGhpczp2b2lkIDAscyksYT1sKSxpfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxpIGFzIG1lbW9pemVPbmVGYWN0b3J5LHIgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXAiLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFByZXBlbmQgZXZlcnkgZXhpc3RpbmcgYG5vZGVfbW9kdWxlcy8uYmluYCBkaXJlY3RvcnkgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IHVwIHRvIHRoZVxuICogcmVwb3NpdG9yeSByb290IChvciBmaWxlc3lzdGVtIHJvb3QpIHRvIHRoZSBlbnZpcm9ubWVudCdzIFBBVEgsIG5lYXJlc3QgZGlyZWN0b3J5IGZpcnN0IHNvXG4gKiBhIHdvcmtzcGFjZS1sb2NhbCBkZXBlbmRlbmN5IHdpbnMgb3ZlciBhIHJlcG9zaXRvcnktcm9vdCBvbmUuIE5lZWRlZCB3aGVyZXZlciB3YiBzdHJpcHNcbiAqIHlhcm4ncyB0ZW1wb3JhcnkgYmluIGZvbGRlciBmcm9tIFBBVEggKHlhcm4gQmVycnkgZXhwb3NlcyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzIG9ubHlcbiAqIHRocm91Z2ggdGhhdCBmb2xkZXIsIG5ldmVyIHRocm91Z2ggYG5vZGVfbW9kdWxlcy8uYmluYCBvbiBQQVRIKSwgc28gdGhhdCBiYXJlIGJpbmFyeSBuYW1lc1xuICogaW4gd3JhcHBlZCBjb21tYW5kcyBrZWVwIHJlc29sdmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChkaXJQYXRoOiBzdHJpbmcsIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IGJvb2xlYW4ge1xuICBjb25zdCBiaW5QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgIGJpblBhdGhzLnB1c2goYmluUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICBpZiAoYmluUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGVudi5QQVRIID0gZW52LlBBVEggPyBgJHtiaW5QYXRocy5qb2luKCc6Jyl9OiR7ZW52LlBBVEh9YCA6IGJpblBhdGhzLmpvaW4oJzonKTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUcnV0aHlFbnZWYWx1ZShjaUVudik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHJ1dGh5RW52VmFsdWUocHJvamVjdC5lbnYuV0JfRE9DS0VSKTtcbn1cblxuZnVuY3Rpb24gaXNUcnV0aHlFbnZWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXZhbHVlICYmIHZhbHVlICE9PSAnMCcgJiYgdmFsdWUgIT09ICdmYWxzZSc7XG59XG4iLCIvKipcbiAqIFRoZSBrZXlzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBwcm9qZWN0J3MgZm5veCBzb3VyY2VzLiBgbWlzZSBlbnZgIGlzIHJlcG9ydGVkIGFzIGFcbiAqIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIChQQVRILCBDQVJHT19IT01FLCBSVVNUVVBfKiwgLi4uKTsgdGhvc2UgbXVzdFxuICogbmV2ZXIgYmUgdHJlYXRlZCBhcyB0aGUgcHJvamVjdCdzIG93biB2YXJpYWJsZXMsIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RGbm94U291cmNlZEtleXMoZW52U291cmNlczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCByZWFkb25seSBzdHJpbmdbXV0+KTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VzQnVuUnVudGltZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTWlycm9ycyBQcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcjogdGhlIG91dGVybW9zdCBwYWNrYWdlTWFuYWdlciBkZWNsYXJhdGlvbiAodGhlXG4gIC8vIHdvcmtzcGFjZSByb290J3MpIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBuZXN0ZWQgb25lcywgYW5kIGFuIGV4cGxpY2l0IG5vbi1CdW4gZGVjbGFyYXRpb25cbiAgLy8gd2lucyBvdmVyIHRoZSBkaXJlY3RvcnkgbWFya2Vycy4gVGhlIHdhbGsgdGhlcmVmb3JlIGNvbGxlY3RzIHNpZ25hbHMgdXAgdG8gdGhlIHJlcG9zaXRvcnlcbiAgLy8gcm9vdCBpbnN0ZWFkIG9mIGRlY2lkaW5nIGF0IHRoZSBmaXJzdCBoaXQsIHNvIGEgY2hpbGQgd29ya3NwYWNlIGNhbm5vdCBvdmVycmlkZSB0aGUgcm9vdC5cbiAgbGV0IG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyOiB1bmtub3duO1xuICBsZXQgaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciA9IGZhbHNlO1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJlYWRQYWNrYWdlTWFuYWdlckZpZWxkKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgICBpZiAocGFja2FnZU1hbmFnZXIgIT09IHVuZGVmaW5lZCkgb3V0ZXJtb3N0UGFja2FnZU1hbmFnZXIgPSBwYWNrYWdlTWFuYWdlcjtcbiAgICBoYXNTb21lQnVuRGlyZWN0b3J5TWFya2VyIHx8PSBoYXNCdW5EaXJlY3RvcnlNYXJrZXIoY3VycmVudFBhdGgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkgfHwgcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSA9PT0gY3VycmVudFBhdGgpIHtcbiAgICAgIGlmIChpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIob3V0ZXJtb3N0UGFja2FnZU1hbmFnZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciB8fCBpc0J1blBhY2thZ2VNYW5hZ2VyKG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkaXJlY3RvcnkgY2FycmllcyBhIGJ1biBtYXJrZXI6IGEgYnVuIGxvY2tmaWxlLCBhIG1pc2UtcGlubmVkIGJ1biwgb3IgYVxuICogYC50b29sLXZlcnNpb25zYCBidW4gZW50cnkuIHdiZnkgbWlncmF0ZXMgLnRvb2wtdmVyc2lvbnMgaW50byBtaXNlLnRvbWwsIHNvIGEgbWlzZS1waW5uZWQgYnVuXG4gKiBtdXN0IGNvdW50IGFzIHdlbGw6IHJlcG9zIHRoYXQgZ2l0aWdub3JlIGJ1bi5sb2NrIGFuZCBoYXZlIG5vIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIHJlbHkgb24gdGhlXG4gKiB0b29sIG1hbmlmZXN0LiBUaGlzIGlzIHRoZSBzaW5nbGUgc2lnbmFsIGxpc3QgZGVjaWRpbmcgYnVuLXZzLXlhcm47IGBQcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcmBcbiAqIGFuZCBgdXNlc0J1blJ1bnRpbWVgIHNoYXJlIGl0IOKAlCBhbmQgYm90aCBnaXZlIGFuIGV4cGxpY2l0IG5vbi1CdW4gcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb25cbiAqIHByZWNlZGVuY2Ugb3ZlciBpdCAoc2VlIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcikg4oCUIHNvIHRoZSB0d28gZGV0ZWN0aW9ucyBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNCdW5EaXJlY3RvcnlNYXJrZXIoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSkgfHxcbiAgICBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgICB0ZXN0RmlsZUNvbnRlbnQocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgL15cXHMqKD86XCJidW5cInxidW4pXFxzKj0vbSlcbiAgICApIHx8XG4gICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbihkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgLyhefFxcbilidW5cXHMvKVxuICApO1xufVxuXG4vKipcbiAqIEFuIGV4cGxpY2l0IG5vbi1CdW4gcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb24gKGUuZy4gYHlhcm5ANC4xNy4wYCkgb3ZlcnJpZGVzIHRoZSBkaXJlY3RvcnlcbiAqIG1hcmtlcnM6IHlhcm4tZXJhIHJlcG9zaXRvcmllcyBtYXkgcGluIGJ1biBpbiBtaXNlLnRvbWwgc29sZWx5IGZvciBgYnVueGAtYmFzZWQgaGVscGVyc1xuICogKGUuZy4gYHdiIHJhaWx3YXktZW52YCksIGFuZCBCdW4tbWFuYWdlZCByZXBvc2l0b3JpZXMgbmV2ZXIgZGVjbGFyZSBhIG5vbi1CdW4gcGFja2FnZU1hbmFnZXJcbiAqICh3YmZ5IGRlbGV0ZXMgdGhlIGZpZWxkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiAhIXBhY2thZ2VNYW5hZ2VyLnRyaW0oKSAmJiAhaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J1blBhY2thZ2VNYW5hZ2VyKHBhY2thZ2VNYW5hZ2VyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VNYW5hZ2VyRmllbGQocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBwYWNrYWdlTWFuYWdlcj86IHVua25vd24gfSkucGFja2FnZU1hbmFnZXI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgQUxMT1dFRF9URVNUX0RJUkVDVE9SWV9OQU1FUyA9IG5ldyBTZXQoWyd1bml0JywgJ2UyZScsICdkZWJ1ZycsICdoZWxwZXJzJywgJ2ZpeHR1cmVzJ10pO1xuY29uc3QgUlVOTkFCTEVfVEVTVF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsndW5pdCcsICdlMmUnLCAnZGVidWcnXSk7XG5jb25zdCBURVNUX0ZJTEVfTkFNRV9SRUdFWFAgPSAvXFwuKD86dGVzdHxzcGVjKVxcLltjbV0/W2p0XXN4PyQvO1xuXG4vKipcbiAqIEVuZm9yY2VzIHRoZSB0ZXN0LWxheW91dCBjb252ZW50aW9uIHdpdGggbm8gZmFsbGJhY2s6IGB0ZXN0L2AgbWF5IGNvbnRhaW4gb25seSB0aGUgYHVuaXRgLCBgZTJlYCxcbiAqIGBkZWJ1Z2AsIGBoZWxwZXJzYCwgYW5kIGBmaXh0dXJlc2AgZGlyZWN0b3JpZXMsIGFuZCB0ZXN0IGZpbGVzIG1heSBleGlzdCBvbmx5IHVuZGVyIGB0ZXN0L3VuaXQvYCxcbiAqIGB0ZXN0L2UyZS9gLCBhbmQgYHRlc3QvZGVidWcvYCDigJQgYW55d2hlcmUgZWxzZSBpbiB0aGUgcHJvamVjdCAoZS5nLiBgdGVzdC9oZWxwZXJzL2AsIGBzcmMvYCwgb3IgdGhlXG4gKiBwcm9qZWN0IHJvb3QpLCB3YiB3b3VsZCBzaWxlbnRseSBza2lwIHRoZW0uIEEgcHJvamVjdCdzIG93biBQbGF5d3JpZ2h0IGNvbmZpZyBhbHNvIHJlcXVpcmVzXG4gKiBgdGVzdC9lMmVgIGZvciB0aGUgc2FtZSByZWFzb24uIGB0ZXN0L2ZpeHR1cmVzL2AgaXMgZXhlbXB0IGZyb20gdGhlIHRlc3QtZmlsZSBjaGVjayBiZWNhdXNlXG4gKiBmaXh0dXJlcyBtYXkgY29udGFpbiB0ZXN0IGZpbGVzIGFzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGVzdERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpO1xuICBjb25zdCB2aW9sYXRpb25zID0gWy4uLmZpbmRGaWxlU3lzdGVtVmlvbGF0aW9ucyhwcm9qZWN0LmRpclBhdGgpXTtcbiAgLy8gT25seSBhIHByb2plY3QncyBPV04gUGxheXdyaWdodCBjb25maWcgY291bnRzOiBhIHdvcmtzcGFjZSByb290IGxlZ2l0aW1hdGVseSBzaGFyZXMgYSByb290LWxldmVsXG4gIC8vIHBsYXl3cmlnaHQuY29uZmlnLnRzIHdoaWxlIGtlZXBpbmcgZTJlIHNwZWNzIGluIGEgc2luZ2xlIGFwcCBwYWNrYWdlLiBDaGVja2VkIG91dHNpZGUgdGhlXG4gIC8vIG1lbW9pemVkIHdhbGsgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBjYWxsZXItc3VwcGxpZWQgcGFja2FnZUpzb24sIG5vdCBvbmx5IHRoZSBkaXJlY3RvcnkuXG4gIGlmIChcbiAgICAhcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGVzdERpclBhdGgsICdlMmUnKSlcbiAgKSB7XG4gICAgdmlvbGF0aW9ucy5wdXNoKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiB2aW9sYXRpb25zO1xufVxuXG4vLyBUaGUgcmVjdXJzaXZlIHdhbGsgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0IGFuZCBydW5zIGZvciB0aGUgc2FtZSBkaXJlY3RvcmllcyBmcm9tIGJvdGggYHdiIGxpbnRgXG4vLyBhbmQgYHdiIHRlc3RgIHdpdGhpbiBvbmUgYHdiIHZlcmlmeWAsIHNvIGl0cyByZXN1bHQgaXMgc2hhcmVkIHBlciBwcm9qZWN0IGRpcmVjdG9yeS5cbmNvbnN0IGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSgpOiB2b2lkIHtcbiAgZmlsZVN5c3RlbVZpb2xhdGlvbnNDYWNoZS5jbGVhcigpO1xufVxuXG5mdW5jdGlvbiBmaW5kRmlsZVN5c3RlbVZpb2xhdGlvbnMocHJvamVjdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY2FjaGVkVmlvbGF0aW9ucyA9IGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuZ2V0KHByb2plY3REaXJQYXRoKTtcbiAgaWYgKGNhY2hlZFZpb2xhdGlvbnMpIHJldHVybiBjYWNoZWRWaW9sYXRpb25zO1xuXG4gIGNvbnN0IHZpb2xhdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHRlc3REaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXJQYXRoLCAndGVzdCcpO1xuICBpZiAoZnMuZXhpc3RzU3luYyh0ZXN0RGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKHRlc3REaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIC8vIE9TIGFuZCBlZGl0b3IgYXJ0aWZhY3RzIHN1Y2ggYXMgLkRTX1N0b3JlIGFyZSBlbnZpcm9ubWVudCBub2lzZSwgbm90IGxheW91dCBtaXN0YWtlcy5cbiAgICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgIUFMTE9XRURfVEVTVF9ESVJFQ1RPUllfTkFNRVMuaGFzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaChgdGVzdC8ke2VudHJ5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbGxlY3RTdHJheVRlc3RGaWxlcyhwcm9qZWN0RGlyUGF0aCwgJycsIHZpb2xhdGlvbnMpO1xuICAvLyBBIHRlc3QgZmlsZSBkaXJlY3RseSB1bmRlciB0ZXN0LyBpcyByZXBvcnRlZCBieSBib3RoIHRoZSB0b3AtbGV2ZWwgY2hlY2sgYW5kIHRoZSBzdHJheS1maWxlIHdhbGsuXG4gIGNvbnN0IHVuaXF1ZVZpb2xhdGlvbnMgPSBbLi4ubmV3IFNldCh2aW9sYXRpb25zKV07XG4gIGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuc2V0KHByb2plY3REaXJQYXRoLCB1bmlxdWVWaW9sYXRpb25zKTtcbiAgcmV0dXJuIHVuaXF1ZVZpb2xhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJheVRlc3RGaWxlcyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZURpclBhdGg6IHN0cmluZywgdmlvbGF0aW9uczogc3RyaW5nW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIC8vIEhpZGRlbiBlbnRyaWVzICguZ2l0LCAudG1wLCAubmV4dCwgLi4uKSBhbmQgZGVwZW5kZW5jaWVzIGFyZSBub3QgcHJvamVjdC1hdXRob3JlZCB0ZXN0IGxvY2F0aW9uczpcbiAgICAvLyB0aGUgY29udmVudGlvbiBwbGFjZXMgdGVzdHMgb25seSB1bmRlciB0ZXN0Lywgc28gYSB0ZXN0IGZpbGUgaW4gYSBoaWRkZW4gZGlyZWN0b3J5IChlLmcuXG4gICAgLy8gLnN0b3J5Ym9vaykgaXMgb3V0c2lkZSB0aGUgaW5wdXQgY29udHJhY3QsIGFuZCBlbnVtZXJhdGluZyBlbnZpcm9ubWVudGFsIGhpZGRlbiBkaXJlY3Rvcmllc1xuICAgIC8vIGluc3RlYWQgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gYW55IHVubGlzdGVkIGdlbmVyYXRlZCBvbmUgKC50dXJibywgLndyYW5nbGVyLCAuLi4pLiBWaXNpYmxlXG4gICAgLy8gYnVpbGQgb3V0cHV0cyBzdWNoIGFzIGRpc3QvIGFyZSBkZWxpYmVyYXRlbHkgTk9UIHNraXBwZWQ6IHdiZnktbWFuYWdlZCBidWlsZHMgbmV2ZXIgZW1pdFxuICAgIC8vIHRlc3QtcGF0dGVybiBmaWxlcyB0aGVyZSwgc28gYW55IG1hdGNoIGlzIGFuIGF1dGhvcmVkIGZpbGUgd29ydGggZmxhZ2dpbmcuXG4gICAgLy8gU3ltbGlua3MgZmFpbCBgaXNEaXJlY3RvcnkoKWAgb24gYSBEaXJlbnQsIHNvIGN5Y2xlcyBhcmUgaW1wb3NzaWJsZS5cbiAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykgfHwgZW50cnkubmFtZSA9PT0gJ25vZGVfbW9kdWxlcycpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlRGlyUGF0aCA/IGAke3JlbGF0aXZlRGlyUGF0aH0vJHtlbnRyeS5uYW1lfWAgOiBlbnRyeS5uYW1lO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyB0ZXN0L3VuaXQsIHRlc3QvZTJlLCBhbmQgdGVzdC9kZWJ1ZyBob2xkIHRoZSBydW5uYWJsZSB0ZXN0czsgdGVzdC9maXh0dXJlcyBtYXkgY29udGFpblxuICAgICAgLy8gdGVzdCBmaWxlcyBhcyBkYXRhLlxuICAgICAgaWYgKHJlbGF0aXZlRGlyUGF0aCA9PT0gJ3Rlc3QnICYmIChSVU5OQUJMRV9URVNUX0RJUkVDVE9SWV9OQU1FUy5oYXMoZW50cnkubmFtZSkgfHwgZW50cnkubmFtZSA9PT0gJ2ZpeHR1cmVzJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBIG5lc3RlZCBwYWNrYWdlIChlLmcuIGEgd29ya3NwYWNlIG1lbWJlcikgaXMgdmFsaWRhdGVkIGFzIGl0cyBvd24gcHJvamVjdC5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgcmVsYXRpdmVQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICAgIGNvbGxlY3RTdHJheVRlc3RGaWxlcyhwcm9qZWN0RGlyUGF0aCwgcmVsYXRpdmVQYXRoLCB2aW9sYXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKFRFU1RfRklMRV9OQU1FX1JFR0VYUC50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdE5hbWU6IHN0cmluZywgdmlvbGF0aW9uczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBjaGFsay5yZWQoXG4gICAgICBgSW52YWxpZCB0ZXN0IGxheW91dCBpbiAke3Byb2plY3ROYW1lfS4gdGVzdC8gbWF5IGNvbnRhaW4gb25seSB0aGUgdW5pdCwgZTJlLCBkZWJ1ZywgaGVscGVycywgYW5kIGZpeHR1cmVzIGRpcmVjdG9yaWVzLCB0ZXN0IGZpbGVzIG1heSBleGlzdCBvbmx5IHVuZGVyIHRlc3QvdW5pdC8sIHRlc3QvZTJlLywgYW5kIHRlc3QvZGVidWcvLCBhbmQgYSBQbGF5d3JpZ2h0IGNvbmZpZyByZXF1aXJlcyB0ZXN0L2UyZS86XFxuYCArXG4gICAgICAgIHZpb2xhdGlvbnMubWFwKCh2aW9sYXRpb24pID0+IGAgICR7dmlvbGF0aW9ufWApLmpvaW4oJ1xcbicpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgZXZlcnkgcHJvamVjdCdzIGxheW91dCB2aW9sYXRpb25zIGFuZCB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgYW55IHByb2plY3QgdmlvbGF0ZWQgdGhlXG4gKiBjb252ZW50aW9uLCBzbyBhIHNpbmdsZSBydW4gc3VyZmFjZXMgYWxsIG9mIHRoZW0gaW5zdGVhZCBvZiBvbmx5IHRoZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICduYW1lJyB8ICdwYWNrYWdlSnNvbic+W10pOiBib29sZWFuIHtcbiAgbGV0IHZpb2xhdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnN0IHZpb2xhdGlvbnMgPSBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdCk7XG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdC5uYW1lLCB2aW9sYXRpb25zKTtcbiAgICB2aW9sYXRlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHZpb2xhdGVkO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi9zaGVsbC5qcyc7XG5cbmNvbnN0IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXTtcblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgZ2VuZXJhdGluZyBhIC5kZXYudmFycyBmaWxlICh2aWEgYHdiIGdlbi1kZXYtdmFyc2ApIHNvIHRoYXRcbiAqIGB3cmFuZ2xlciBkZXZgIGNhbiBzZWUgdGhlIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2OiBTY3JpcHRBcmd2LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3diJywgJ2dlbi1kZXYtdmFycycsIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSwgb3V0cHV0UGF0aF0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgYHdyYW5nbGVyIGRldmAtc3R5bGUgY29tbWFuZC4gYGVudiAtdSBDTE9VREZMQVJFX0VOVmAgbWFrZXMgd3JhbmdsZXIgc2VydmUgdGhlIHRvcC1sZXZlbFxuICogKG5vbi1kZXBsb3kpIGNvbmZpZy4gd3JhbmdsZXIgKGxpa2UgdmluZXh0KSByZXF1aXJlcyByZWFsIE5vZGUuanMg4oCUIGBidW4gcnVuYCByZXNwZWN0cyB0aGUgYmluJ3NcbiAqIG5vZGUgc2hlYmFuZywgYW5kIHdiIG5ldmVyIGNvbXBvc2VzIGAtLWJ1bmAgKHdob3NlIG5vZGUtPmJ1biBQQVRIIHNoaW0gYnJlYWtzIGJvdGggdG9vbHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoYXJnczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlYgWUFSTiB3cmFuZ2xlciAke2FyZ3N9YC50cmltKCk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGFwcGx5aW5nIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIHRvIHRoZSBsb2NhbCBkYXRhYmFzZSwgb3IgdW5kZWZpbmVkXG4gKiBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2Ugb3Igbm8gd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LlxuICogQ0k9dHJ1ZSBzdXBwcmVzc2VzIHdyYW5nbGVyJ3MgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lIHx8ICFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIHJldHVybiBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgO1xufVxuXG4vKipcbiAqIFByZWZpeCB0aGUgZ2l2ZW4gc2NyaXB0IHdpdGggY29tbWFuZHMgZXhwb3J0aW5nIERBVEFCQVNFX1VSTCBwb2ludGluZyB0byB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLFxuICogc28gdGhhdCBkcml6emxlLWtpdCBhbmQgc2VlZCBzY3JpcHRzIGNhbiBvcGVyYXRlIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSBhcHAuXG4gKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBpbiBpdHMgd3JhbmdsZXIgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4sIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lKSByZXR1cm4gc2NyaXB0O1xuXG4gIC8vIEV4Y2x1ZGluZyBtaW5pZmxhcmUncyBtZXRhZGF0YS5zcWxpdGUsIHdoaWNoIGxpdmVzIG5leHQgdG8gdGhlIGhhc2gtbmFtZWQgZGF0YWJhc2UgZmlsZS5cbiAgLy8gQW4gdW5tYXRjaGVkIGdsb2IgY2Fubm90IGhhcHBlbiBoZXJlOiB0aGUgc2NyaXB0IHJ1bnMgdW5kZXIgL2Jpbi9zaCAodmlhIE5vZGUncyBgc2hlbGw6IHRydWVgKSxcbiAgLy8gYW5kIHRoZSBwcmVjZWRpbmcgbWF0ZXJpYWxpemF0aW9uIGNvbW1hbmQgZ3VhcmFudGVlcyB0aGUgU1FMaXRlIGZpbGUgZXhpc3RzLlxuICAvLyBQcm9qZWN0cyB3aXRoIG11bHRpcGxlIEQxIGRhdGFiYXNlcyBhcmUgbm90IHN1cHBvcnRlZDogdGhlIGhhc2gtbmFtZWQgZmlsZXMgY2Fubm90IGJlXG4gIC8vIGRpc3Rpbmd1aXNoZWQgY2hlYXBseSAobWF0ZXJpYWxpemF0aW9uIGRvZXMgbm90IGV2ZW4gdXBkYXRlIHRoZSB0YXJnZXQgZmlsZSdzIG10aW1lKS5cbiAgLy8gVGhlIHN0YXRlIGRpcmVjdG9yeSBtdXN0IGJlIGFic29sdXRlIGJlY2F1c2UgdGhlIHdyYXBwZWQgc2NyaXB0IG1heSBgY2RgIHRvIHRoZSBtb25vcmVwbyByb290LlxuICBjb25zdCBzdGF0ZURpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCkpO1xuICBjb25zdCBleHBvcnRDb21tYW5kID0gYGV4cG9ydCBEQVRBQkFTRV9VUkw9XCJmaWxlOiQobHMgXCIke3N0YXRlRGlyUGF0aH1cIi92My9kMS9taW5pZmxhcmUtRDFEYXRhYmFzZU9iamVjdC8qLnNxbGl0ZSB8IGdyZXAgLXYgbWV0YWRhdGEgfCBoZWFkIC0xKVwiYDtcbiAgcmV0dXJuIGAke2J1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0LCBkYXRhYmFzZU5hbWUpfSAmJiAke2V4cG9ydENvbW1hbmR9ICYmICR7c2NyaXB0fWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBEMSBkYXRhYmFzZSBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG5cbiAgcmV0dXJuIHNjYW5XcmFuZ2xlckNvbmZpZ1ZhbHVlKGNvbmZpZ1BhdGgsICdkYXRhYmFzZV9uYW1lJyk7XG59XG5cbi8vIExvb2tlZCB1cCBmcm9tIG1hbnkgY2FsbCBzaXRlcyAoZnJhbWV3b3JrIGRldGVjdGlvbiwgd29ya2VyLXR5cGVzIGdlbmVyYXRpb24sIGRlcGxveSwgdGVzdCksIHNvXG4vLyB0aGUgZXhpc3RlbmNlIHByb2JlcyBhcmUgc2hhcmVkLiBLZXllZCBvbiB0aGUgcHJvamVjdCBPQkpFQ1QgKG5vdCBpdHMgZGlyZWN0b3J5IHBhdGgpOiB0aGUgc2FtZVxuLy8gc2hhcmVkIFByb2plY3QgaW5zdGFuY2UgZmxvd3MgdGhyb3VnaCBldmVyeSBjYWxsIHNpdGUgd2l0aGluIG9uZSBpbnZvY2F0aW9uLCB3aGlsZSBjYWxsZXJzIHRoYXRcbi8vIHJld3JpdGUgY29uZmlncyBhbmQgcGFzcyBmcmVzaCBwYXJ0aWFsIG9iamVjdHMgbXVzdCBvYnNlcnZlIHRoZSBjdXJyZW50IGRpc2sgc3RhdGUuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ1BhdGhDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgeyBjb25maWdQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfT4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gVGVzdHMgbWF5IHBhc3MgcGFydGlhbCBQcm9qZWN0IG9iamVjdHMgd2l0aG91dCBkaXJQYXRoLlxuICBpZiAoIXByb2plY3QuZGlyUGF0aCkgcmV0dXJuO1xuICBjb25zdCBjYWNoZWQgPSB3cmFuZ2xlckNvbmZpZ1BhdGhDYWNoZS5nZXQocHJvamVjdCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQuY29uZmlnUGF0aDtcblxuICBjb25zdCBjb25maWdQYXRoID0gd3JhbmdsZXJDb25maWdGaWxlTmFtZXNcbiAgICAubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZU5hbWUpKVxuICAgIC5maW5kKChmaWxlUGF0aCkgPT4gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpO1xuICB3cmFuZ2xlckNvbmZpZ1BhdGhDYWNoZS5zZXQocHJvamVjdCwgeyBjb25maWdQYXRoIH0pO1xuICByZXR1cm4gY29uZmlnUGF0aDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggb2YgdGhlIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIGRpcmVjdG9yeSAoYG1pZ3JhdGlvbnNfZGlyYCBpbiB0aGUgd3JhbmdsZXJcbiAqIGNvbmZpZywgZGVmYXVsdGluZyB0byBgbWlncmF0aW9uc2ApIGlmIGl0IGV4aXN0cyBvbiBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5qb2luKFxuICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoLCAnbWlncmF0aW9uc19kaXInKSA/PyAnbWlncmF0aW9ucydcbiAgKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpID8gbWlncmF0aW9uc0RpclBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIGRlY2xhcmVkIGZvciB0aGUga2V5IGluIHRoZSB3cmFuZ2xlciBjb25maWcsIGNvdmVyaW5nIEpTT04oQylcbiAqIChgXCJrZXlcIjogXCIuLi5cImApIGFuZCBUT01MLCBpbmNsdWRpbmcgaXRzIGlubGluZS10YWJsZSBmb3JtIChgZDFfZGF0YWJhc2VzID0gW3sgLi4uLCBrZXkgPSBcIi4uLlwiIH1dYCksXG4gKiB3aXRob3V0IGZ1bGwgcGFyc2Vycy4gQ29tbWVudGVkLW91dCBsaW5lcyBhcmUgc2tpcHBlZCBzbyB0aGF0IHRoZXkgY2Fubm90IHNoYWRvdyB0aGUgYWN0aXZlXG4gKiB2YWx1ZSwgYW5kIHRoZSBrZXkgbXVzdCBmb2xsb3cgYSBsaW5lIHN0YXJ0LCBge2Agb3IgYCxgIHNvIHRoYXQgcHJvc2UgbWVudGlvbmluZyBpdCBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIHNjYW5XcmFuZ2xlckNvbmZpZ1ZhbHVlKGNvbmZpZ1BhdGg6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlWYWx1ZVBhdHRlcm4gPSBuZXcgUmVnRXhwKGAoPzpefFsse10pXFxcXHMqW1wiJ10/JHtrZXl9W1wiJ10/XFxcXHMqWzo9XVxcXFxzKltcIiddKFteXCInXSspW1wiJ11gLCAndScpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSBrZXlWYWx1ZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIG1hdGVyaWFsaXppbmcgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqIEEgbm8tb3AgcXVlcnkgZm9yY2VzIG1pbmlmbGFyZSB0byBjcmVhdGUgdGhlIFNRTGl0ZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LlxuICogT25seSBzdGRvdXQgaXMgc3VwcHJlc3NlZDsgd3JhbmdsZXIgcmVwb3J0cyBlcnJvcnMgb24gc3RkZXJyLCB3aGljaCBtdXN0IHN0YXkgdmlzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPiwgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFlBUk4gd3JhbmdsZXIgZDEgZXhlY3V0ZSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWNvbW1hbmQgXCJTRUxFQ1QgMVwiID4gL2Rldi9udWxsYDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxvY2FsIHdyYW5nbGVyL21pbmlmbGFyZSBzdGF0ZSBkaXJlY3RvcnkuXG4gKiBEZXZlbG9wbWVudCBmb2xsb3dzIHdyYW5nbGVyJ3MgZGVmYXVsdCBkaXJlY3Rvcnkgc28gdGhhdCBwbGFpbiBgd3JhbmdsZXIgZGV2YCAvIGB2aW5leHQgZGV2YFxuICogKHdpdGhvdXQgYSBwZXJzaXN0LXBhdGggb3ZlcnJpZGUpIHNoYXJlcyB0aGUgc2FtZSBkYXRhYmFzZSBhcyB3Yi1tYW5hZ2VkIGRiIGNvbW1hbmRzLlxuICogT3RoZXIgZW52aXJvbm1lbnRzIChlLmcuIHRlc3QpIGdldCB0aGVpciBvd24gZGlyZWN0b3J5IHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzZXRcbiAqIHdpdGhvdXQgZGVzdHJveWluZyBkZXZlbG9wbWVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB7XG4gIC8vIERlc3RydWN0aXZlIHRlc3QgcmVzZXRzIGFyZSBnYXRlZCBvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpLCB3aGljaCBhY2NlcHRzXG4gIC8vIGVpdGhlciBXQl9FTlYgb3IgTUlTRV9FTlY7IHJlc29sdmUgdG8gdGhlIHRlc3QgZGlyZWN0b3J5IHdoZW5ldmVyIGVpdGhlciBzYXlzICd0ZXN0JyBzb1xuICAvLyB0aGF0IHN1Y2ggcmVzZXRzIGNhbiBuZXZlciB0YXJnZXQgdGhlIGRldmVsb3BtZW50IHN0YXRlLlxuICBjb25zdCB3YkVudiA9IFtwcm9qZWN0LmVudi5XQl9FTlYsIHByb2plY3QuZW52Lk1JU0VfRU5WXS5pbmNsdWRlcygndGVzdCcpXG4gICAgPyAndGVzdCdcbiAgICA6IHByb2plY3QuZW52LldCX0VOViB8fCBwcm9qZWN0LmVudi5NSVNFX0VOVjtcbiAgcmV0dXJuICF3YkVudiB8fCB3YkVudiA9PT0gJ2RldmVsb3BtZW50JyA/ICcud3JhbmdsZXIvc3RhdGUnIDogYC53cmFuZ2xlci9zdGF0ZS0ke3diRW52fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIHJlc29sdmVGYWxsYmFja1diRW52LFxuICBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi91dGlscy9lbnZTb3VyY2VzLmpzJztcbmltcG9ydCB7IGhhc0J1bkRpcmVjdG9yeU1hcmtlciwgaXNCdW5QYWNrYWdlTWFuYWdlciwgaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB7IGNsZWFyVGVzdFN0cnVjdHVyZUNhY2hlIH0gZnJvbSAnLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuLyoqIFRoZSBmaWxlIGB3cmFuZ2xlciB0eXBlc2Agd3JpdGVzIGJ5IGRlZmF1bHQuICovXG5jb25zdCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FID0gJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2VzQnVuUGFja2FnZU1hbmFnZXI7XG4gIH1cblxuICAvLyBUaGUgcGFja2FnZSBtYW5hZ2VyIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2I6XG4gIC8vIGBub2RlIHdiIC4uLmAgYWdhaW5zdCBhIEJ1biByZXBvIG11c3Qgc3RpbGwgcnVuIGBidW4gaW5zdGFsbGAsIGFuZCB2aWNlIHZlcnNhLlxuICBnZXQgcGFja2FnZU1hbmFnZXJDb21tYW5kKCk6ICdidW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZCgpOiAnYnVuIHJ1bicgfCAneWFybicge1xuICAgIHJldHVybiB0aGlzLmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgc2lnbmFsIGRlY2lkZXMgZXZlcnkgYnVuLXZzLXlhcm4gYnJhbmNoIGluIHdiIChzY3JpcHQgbm9ybWFsaXphdGlvbiBpbmNsdWRlZCk6XG4gIC8vIHNwbGl0dGluZyB0aGUgdG9vbC1tYW5pZmVzdCBzaWduYWwgZnJvbSB0aGUgbG9ja2ZpbGUgc2lnbmFsIG9uY2UgcHJvZHVjZWQgY29tbWFuZHMgbWl4aW5nXG4gIC8vIGBidW4gaW5zdGFsbGAgd2l0aCBgeWFybiBwcmlzbWEgLi4uYCBpbiBtaXNlLXBpbm5lZCByZXBvcyB3aG9zZSBidW4ubG9jayBpcyBnaXRpZ25vcmVkLlxuICBAbWVtb2l6ZU9uZVxuICBnZXQgdXNlc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnJvb3RQYWNrYWdlSnNvbj8ucGFja2FnZU1hbmFnZXIgPz8gdGhpcy5wYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlcjtcbiAgICBpZiAoaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyKHBhY2thZ2VNYW5hZ2VyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChoYXNCdW5EaXJlY3RvcnlNYXJrZXIodGhpcy5yb290RGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBpc0J1blBhY2thZ2VNYW5hZ2VyKHBhY2thZ2VNYW5hZ2VyKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICAvKiogQSB3b3Jrc3BhY2Ugcm9vdCB3aXRob3V0IHNvdXJjZXMgb2YgaXRzIG93biBydW5zIG5laXRoZXIgbGludCBub3IgdHlwZWNoZWNrIGNvbW1hbmRzLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3duU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCB0aGlzLmhhc1NvdXJjZUNvZGU7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBwcml2YXRlIGRlY2xhcmVkRW52S2V5Q2FjaGU6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGUgUFJPSkVDVCBkZWNsYXJlcyAoaXRzIGZub3gvLmVudiBzb3VyY2VzKSwgZXhjbHVkaW5nXG4gICAqIGJvdGggdGhlIGFtYmllbnQgcHJvY2VzcyBlbnZpcm9ubWVudCBhbmQgdGhlIGBtaXNlIGVudmAgcHNldWRvLXNvdXJjZSB0aGF0IHJlcG9ydHMgaG9zdC90b29sXG4gICAqIHZhcmlhYmxlcyBzdWNoIGFzIFBBVEguIGBlbnZgIGNhbm5vdCBhbnN3ZXIgdGhpczogaXQgbWVyZ2VzIHByb2Nlc3MuZW52LCBzbyBhIHByb2plY3QgdmFyaWFibGVcbiAgICogaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBpbmhlcml0ZWQgb25lIHRoZXJlLlxuICAgKi9cbiAgZ2V0IGRlY2xhcmVkRW52S2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZSkgcmV0dXJuIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZTtcbiAgICBpZiAoIXRoaXMubG9hZEVudikge1xuICAgICAgdGhpcy5kZWNsYXJlZEVudktleUNhY2hlID0gbmV3IFNldCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgWywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGUgPSBzZWxlY3RGbm94U291cmNlZEtleXMoZW52U291cmNlcyk7XG4gICAgcmV0dXJuIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZTtcbiAgfVxuXG4gIC8vIENhY2hlZCBpbiBhIHBsYWluIGZpZWxkIHJhdGhlciB0aGFuIHdpdGggQG1lbW9pemVPbmU6IHRoYXQgZGVjb3JhdG9yIGtleXMgaXRzIGNhY2hlIG9uIGEgaGFzaFxuICAvLyBvZiB0aGUgaW5zdGFuY2UsIHdoaWNoIGNoYW5nZXMgYXMgb3RoZXIgbWVtb2l6ZWQgZ2V0dGVycyBwb3B1bGF0ZSB0aGUgaW5zdGFuY2UsIHNvIGBlbnZgIGNvdWxkXG4gIC8vIHNpbGVudGx5IGJlIHJlY29tcHV0ZWQg4oCUIGRyb3BwaW5nIGluLXBsYWNlIG11dGF0aW9ucyAoZS5nLiBgcHJvamVjdC5lbnYuUE9SVCB8fD0g4oCmYCwgb3IgdGhlXG4gIC8vIHNlY3JldHMgYHdiIGRlcGxveWAgbWVyZ2VzIGZyb20gLmVudi5jbG91ZGZsYXJlKSB0aGF0IGNhbGxlcnMgcmVseSBvbiBmb3Igc3Bhd25lZCBjb21tYW5kcy5cbiAgcHJpdmF0ZSBlbnZDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcblxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmVudkNhY2hlKSByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgICBpZiAoIXRoaXMubG9hZEVudikge1xuICAgICAgdGhpcy5lbnZDYWNoZSA9IHByb2Nlc3MuZW52O1xuICAgICAgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgfVxuXG4gICAgY29uc3QgW21lcmdlZEVudiwgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgdGhpcy5lbnZDYWNoZSA9IG1lcmdlZEVudjtcbiAgICAvLyBgbWlzZSBlbnZgIGlzIGV4Y2x1ZGVkOiBpdCByZXBvcnRzIHRvb2wtYWN0aXZhdGlvbiBvdXRwdXQgKGUuZy4gUEFUSCkgZXZlbiBpbiByZXBvcyB0aGF0XG4gICAgLy8gZGVjbGFyZSBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXQgYWxsLCB3aGljaCBtdXN0IG5vdCB0cmlnZ2VyIHRoZSBDSSBzdHJpY3RuZXNzIGJlbG93LlxuICAgIHRoaXMuY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52KGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnMuc29tZSgoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkpO1xuICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgYW5kIHZhbGlkYXRlcyB0aGUgcmVzb2x2ZWQgYFdCX0VOVmAgcGVyIHRoZSBvcmcgc3RhbmRhcmQgKHNlZSB0aGVcbiAgICogZ3VpZGVsaW5lcy1mb3ItbWlzZS1mbm94IHNraWxsKTpcbiAgICogLSBMb2NhbGx5LCBhbiB1bnNldCBgV0JfRU5WYCBmYWxscyBiYWNrIHRvIHRoZSBzZWxlY3RlZCBjYXNjYWRlIG1vZGUgKGRldmVsb3BtZW50IHVubGVzcyBhXG4gICAqICAgY29tbWFuZCBmb3JjZXMgYW5vdGhlciwgZS5nLiBgd2IgdGVzdGAgZm9yY2VzIHRlc3QpLCBzbyBjYXN1YWwgYGJ1biB3YiAuLi5gIGludm9jYXRpb25zXG4gICAqICAgd29yayBpbiByZXBvc2l0b3JpZXMgdGhhdCBkZWZpbmUgbm8gV0JfRU5WIGF0IGFsbC5cbiAgICogLSBPbiBDSSwgYW4gdW5zZXQgYFdCX0VOVmAgaXMgYSBoYXJkIGVycm9yIHdoZW4gZW52IHNvdXJjZXMgZXhpc3Q6IHdvcmtmbG93cyBtdXN0IGV4cG9ydCB0aGVcbiAgICogICBlbnZpcm9ubWVudCBleHBsaWNpdGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgcnVubmluZyBpbiBhbiBhbWJpZ3VvdXMgbW9kZS5cbiAgICogLSBUaGUgdmFsdWUgbXVzdCBuYW1lIGEgc3RhbmRhcmQgbW9kZTsgYW4gdW5rbm93biB2YWx1ZSAoZS5nLiBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmApIHdvdWxkXG4gICAqICAgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgZGV2ZWxvcG1lbnQgY2FzY2FkZSwgd2hpY2ggaXMgdGhlIGZhaWx1cmUgdGhpcyBndWFyZHMgYWdhaW5zdC5cbiAgICogLSBgTkVYVF9QVUJMSUNfV0JfRU5WYCBpcyBkZXJpdmVkIGZyb20gYFdCX0VOVmAgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgd2hlbiBtaXNzaW5nLCBzbyBhXG4gICAqICAgcHJvZHVjdGlvbiBidWlsZCBjYW4gbm8gbG9uZ2VyIGJha2UgYSBzdGFsZSBkZXZlbG9wbWVudCB2YWx1ZSBpbnRvIHRoZSBjbGllbnQgYnVuZGxlLlxuICAgKiBTa2lwcGVkIHdoZW4gYFdCX1NLSVBfRU5WX0NIRUNLPTFgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52KGhhc0Vudmlyb25tZW50U291cmNlczogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGVudiA9IHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCFlbnYpIHJldHVybjtcbiAgICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcblxuICAgIC8vIE9uIENJLCBXQl9FTlYgbXVzdCBiZSBFWFBPUlRFRCBieSB0aGUgd29ya2Zsb3cg4oCUIGNoZWNrZWQgYWdhaW5zdCBwcm9jZXNzLmVudiwgbm90IHRoZVxuICAgIC8vIG1lcmdlZCBlbnZpcm9ubWVudDogYSBjb21taXR0ZWQgYmFzZSBkZWZhdWx0IChlLmcuIGZub3gncyBkZXZlbG9wbWVudCBlbnRyeSkgd291bGRcbiAgICAvLyBvdGhlcndpc2Ugc2F0aXNmeSB0aGUgY2hlY2sgYW5kIHNpbGVudGx5IHJ1biBDSSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuICAgIGlmIChpc0NJKGVudi5DSSkgJiYgIXByb2Nlc3MuZW52LldCX0VOViAmJiBoYXNFbnZpcm9ubWVudFNvdXJjZXMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAnV0JfRU5WIGlzIG5vdCBleHBvcnRlZCBvbiBDSS4gRXhwb3J0IFdCX0VOViBleHBsaWNpdGx5ICh0aGUgcmV1c2FibGUgd29ya2Zsb3dzIHBhc3MgaXQgdmlhIHRoZSBcImVudmlyb25tZW50XCIgaW5wdXQpLCAnICtcbiAgICAgICAgICAgICdvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIWVudi5XQl9FTlYpIHtcbiAgICAgIC8vIFRoZSBzaGFyZWQgcmVzb2x2ZXIga2VlcHMgdGhpcyBmYWxsYmFjayBjb25zaXN0ZW50IHdpdGggdGhlIGNhc2NhZGUgc2VsZWN0aW9uIEFORCB3aXRoXG4gICAgICAvLyB0aGUgJHtXQl9FTlZ9IGV4cGFuc2lvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgYWxyZWFkeSBwZXJmb3JtZWQ6IHRoZSBmb3JjZWQgY2FzY2FkZVxuICAgICAgLy8gKGUuZy4gYHdiIHRlc3RgKSwgdGhlbiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0LCB0aGVuIHRoZSBBTUJJRU5ULU5PREVfRU5WLWRyaXZlbiBhdXRvXG4gICAgICAvLyBjYXNjYWRlIGNsYW1wZWQgdG8gYSBzdGFuZGFyZCBtb2RlIChhbiBleHBsaWNpdCAtLWNhc2NhZGUtZW52IGtlZXBzIGl0cyB2YWx1ZSBhbmQgaXNcbiAgICAgIC8vIHZhbGlkYXRlZCBiZWxvdyBsaWtlIGFueSBvdGhlciBXQl9FTlYpLlxuICAgICAgY29uc3QgbW9kZSA9IHJlc29sdmVGYWxsYmFja1diRW52KHRoaXMuYXJndik7XG4gICAgICBlbnYuV0JfRU5WID0gbW9kZTtcbiAgICAgIGlmIChoYXNFbnZpcm9ubWVudFNvdXJjZXMgJiYgIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFdCX0VOViBpcyBub3QgZGVmaW5lZDsgZGVmYXVsdGluZyB0byBcIiR7bW9kZX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFQcm9qZWN0LnN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZW52LldCX0VOVikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIG11c3QgYmUgb25lIG9mIGRldmVsb3BtZW50LCB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kdWN0aW9uLCBidXQgaXMgXCIke2Vudi5XQl9FTlZ9XCIuIGAgK1xuICAgICAgICAgICAgJ0ZpeCB0aGUgdmFsdWUgaW4gdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBBIGZvcmNlZCBtb2RlIChhbiBleHBsaWNpdC9jb21tYW5kLWRlZmF1bHQgLS1jYXNjYWRlLWVudiwgb3IgYW4gZXhwb3J0ZWQgV0JfRU5WIHdob3NlXG4gICAgLy8gcHJvZmlsZSB2YWx1ZXMgbWF5IG92ZXJyaWRlIGl0IGxvY2FsbHkgcGVyIGlzc3VlICM5MzApIG11c3Qgbm90IGJlIHNpbGVudGx5IHJlcGxhY2VkIGJ5XG4gICAgLy8gYW5vdGhlciBtb2RlIGFuIGVudiBzb3VyY2UgZGVmaW5lczogYHdiIHRlc3RgIHJlc29sdmluZyBXQl9FTlY9ZGV2ZWxvcG1lbnQgZnJvbSB0aGUgYmFzZVxuICAgIC8vIGZub3ggc2VjcmV0cyB3b3VsZCBydW4gdGhlIHRlc3RzIGFnYWluc3QgZGV2ZWxvcG1lbnQgdmFsdWVzLCBhbmQgYW4gZXhwb3J0ZWRcbiAgICAvLyBXQl9FTlY9cHJvZHVjdGlvbiBvdmVycmlkZGVuIHRvIGRldmVsb3BtZW50IGJ5IHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgd291bGQgYnVpbGQvZGVwbG95XG4gICAgLy8gdGhlIHdyb25nIGVudmlyb25tZW50IHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICAvLyAtLWNhc2NhZGUtbm9kZS1lbnYgZm9yY2VzIDxOT0RFX0VOViB8fCBkZXZlbG9wbWVudD4gKHBlciBpdHMgb3duIGRvY3VtZW50YXRpb24pLCByZWFkIGZyb21cbiAgICAvLyB0aGUgQU1CSUVOVCBlbnZpcm9ubWVudCBsaWtlIHRoZSBjYXNjYWRlIHNlbGVjdGlvbi4gT25seSBhIFNUQU5EQVJEIGZvcmNlZCBtb2RlIGlzIGVuZm9yY2VkOlxuICAgIC8vIGEgbm9uLXN0YW5kYXJkIG9uZSAoZS5nLiBOT0RFX0VOVj1xYSkgYWxyZWFkeSBoYWQgaXRzIGZhbGxiYWNrIGNsYW1wZWQgdG8gZGV2ZWxvcG1lbnQgYWJvdmUsXG4gICAgLy8gYW5kIGVycm9yaW5nIG9uIHRoYXQgY2xhbXAgd291bGQgY29udHJhZGljdCBpdC5cbiAgICBjb25zdCBmb3JjZWRNb2RlID1cbiAgICAgIHRoaXMuYXJndi5jYXNjYWRlRW52ID8/XG4gICAgICAodGhpcy5hcmd2LmNhc2NhZGVOb2RlRW52ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IHByb2Nlc3MuZW52LldCX0VOViB8fCB1bmRlZmluZWQpO1xuICAgIC8vIFRoZSBBVVRPLXNlbGVjdGVkIG1vZGUgY291bnRzIGFzIHRoZSBleHBlY3RhdGlvbiB0b286IHdpdGggbm90aGluZyBzZXQgYW55d2hlcmUsIHRoZVxuICAgIC8vIGRldmVsb3BtZW50IHZhbHVlcyBhcmUgbG9hZGVkLCBzbyBhbiBlbnYgc291cmNlIGRlY2xhcmluZyBXQl9FTlY9cHJvZHVjdGlvbiB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBydW4gZGV2ZWxvcG1lbnQgc291cmNlcyBsYWJlbGVkIGFzIHByb2R1Y3Rpb24uXG4gICAgY29uc3QgZXhwZWN0ZWRNb2RlID1cbiAgICAgIGZvcmNlZE1vZGUgPz8gKHRoaXMuYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpIDogdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGlzIGEgbGVnaXRpbWF0ZSBzZWNvbmQgZXhwZWN0YXRpb246IGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2BcbiAgICAvLyBsb2FkcyB0aGUgc3RhZ2luZyBmaWxlcyB3aGlsZSB0aGUgZmFsbGJhY2sgY29ycmVjdGx5IGZpbGxzIFdCX0VOVj10ZXN0LlxuICAgIGlmIChcbiAgICAgIGV4cGVjdGVkTW9kZSAmJlxuICAgICAgUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGV4cGVjdGVkTW9kZSkgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IGV4cGVjdGVkTW9kZSAmJlxuICAgICAgZW52LldCX0VOViAhPT0gdGhpcy5hcmd2LmNvbW1hbmREZWZhdWx0V2JFbnZcbiAgICApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtlbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRNb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgbW9kZSdzIGVudiBzb3VyY2UgKGUuZy4gdGhlIGZub3ggXCIke2V4cGVjdGVkTW9kZX1cIiBwcm9maWxlKSwgYCArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVxdWlyZXNOZXh0UHVibGljV2JFbnYgJiYgZW52Lk5FWFRfUFVCTElDX1dCX0VOViAhPT0gZW52LldCX0VOVikge1xuICAgICAgLy8gQXNzaWduIHVuY29uZGl0aW9uYWxseSwgbm90IGB8fD1gOiB0aGUgcGFpciBtdXN0IGFncmVlIGJ5IGNvbnZlbnRpb24sIGFuZCBhIHN0YWxlIHZhbHVlXG4gICAgICAvLyAoZS5nLiB0aGUgZm5veCBiYXNlIGRldmVsb3BtZW50IGRlZmF1bHQgd2hpbGUgQ0kgZXhwb3J0cyBXQl9FTlY9dGVzdCkgd291bGQgb3RoZXJ3aXNlXG4gICAgICAvLyBiZSBiYWtlZCBpbnRvIHRoZSBjbGllbnQgYnVuZGxlIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2ZXIgc2lkZSBydW5zIHdpdGggdGhlIGNvcnJlY3QgV0JfRU5WLlxuICAgICAgaWYgKGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgJiYgIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYE92ZXJyaWRpbmcgTkVYVF9QVUJMSUNfV0JfRU5WIChcIiR7ZW52Lk5FWFRfUFVCTElDX1dCX0VOVn1cIikgd2l0aCBXQl9FTlYgKFwiJHtlbnYuV0JfRU5WfVwiKS5gKTtcbiAgICAgIH1cbiAgICAgIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBlbnYuV0JfRU5WO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KCk6IGJvb2xlYW4ge1xuICAgIC8vIE9XTiBkZXBlbmRlbmNpZXMgb25seTogYSByb290LWxldmVsIG5leHQvdmluZXh0IGRldkRlcGVuZGVuY3kgaW4gYSBtaXhlZCBtb25vcmVwbyBtdXN0IG5vdFxuICAgIC8vIGZvcmNlIE5FWFRfUFVCTElDX1dCX0VOViBvbnRvIGV2ZXJ5IG5vbi1OZXh0IHdvcmtzcGFjZSBwYWNrYWdlLlxuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ25leHQnKSB8fCAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ZpbmV4dCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBgd3JhbmdsZXIgdHlwZXNgIHNob3VsZCBnZW5lcmF0ZSBgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c2AgaGVyZS4gQSB3cmFuZ2xlciBjb25maWdcbiAgICogYW5kIGFuIG93biB3cmFuZ2xlciBkZXBlbmRlbmN5IGFyZSBib3RoIHJlcXVpcmVkIOKAlCB3cmFuZ2xlciBleGl0cyBub24temVybyB3aXRob3V0IGEgY29uZmlnLFxuICAgKiBhbmQgaW4gYSBtaXhlZCBtb25vcmVwbyBhIHJvb3QtbGV2ZWwgd3JhbmdsZXIgZGV2RGVwZW5kZW5jeSBtdXN0IG5vdCBtYWtlIGV2ZXJ5IHdvcmtzcGFjZVxuICAgKiBwYWNrYWdlIGVtaXQgdHlwZXMgaXQgbmV2ZXIgY29uc3VtZXMuXG4gICAqXG4gICAqIFRoZSBwYWNrYWdlJ3Mgb3duIGNvbW1pdHRlZCBnaXRpZ25vcmUgcnVsZSBpcyB0aGUgdGhpcmQgc2lnbmFsLCBhbmQgdGhlIG9uZSB0aGF0IHNheXMgdGhlXG4gICAqIHBhY2thZ2UgYWN0dWFsbHkgQ09OU1VNRVMgdGhlIGZpbGU6IHdiZnkgd3JpdGVzIHRoYXQgcnVsZSBvbmx5IGZvciBwYWNrYWdlcyB3aG9zZSBvd24gdHNjb25maWdcbiAgICogY2FuIHJlZmVyZW5jZSBgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c2AsIGFuZCBkZWxpYmVyYXRlbHkgbGVhdmVzIGFsb25lIHBhY2thZ2VzIHRoYXRcbiAgICogaGFuZC1tYWludGFpbiB0aGVpciBgRW52YCBpbnN0ZWFkLiBXaXRob3V0IHRoaXMgY2hlY2ssIHN1Y2ggYSBwYWNrYWdlIHdvdWxkIGdhaW4gYW4gdW50cmFja2VkXG4gICAqIH41MDBLQiBnZW5lcmF0ZWQgZmlsZSBvbiBldmVyeSBpbnN0YWxsLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGdlbmVyYXRlc1dvcmtlclR5cGVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmluZFdyYW5nbGVyQ29uZmlnUGF0aCh0aGlzKSB8fCAhdGhpcy5oYXNPd25EZXBlbmRlbmN5KCd3cmFuZ2xlcicpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRGVmZW5zZSBpbiBkZXB0aCBhZ2FpbnN0IHdiZnkncyBnaXRpZ25vcmUgcnVsZSBhbmQgdGhpcyBwcmVkaWNhdGUgZHJpZnRpbmcgYXBhcnQ6IGlmIHRoZSBwYWNrYWdlIHN0aWxsXG4gICAgLy8gcnVucyBpdHMgb3duIG91dHB1dC1jaGFuZ2luZyBgd3JhbmdsZXIgdHlwZXNgIChlLmcuIGAtLXN0cmljdC12YXJzPWZhbHNlYCksIHRoZSBiYXJlIGludm9jYXRpb24gaGVyZSB3b3VsZFxuICAgIC8vIG92ZXJ3cml0ZSB0aGF0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCBgRW52YC5cbiAgICBpZiAoaGFzT3V0cHV0Q2hhbmdpbmdXcmFuZ2xlclR5cGVzKHRoaXMucGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSwgdGhpcy5kaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBoYXNNYW5hZ2VkR2l0aWdub3JlUnVsZSh0aGlzLmRpclBhdGgsIFdPUktFUl9UWVBFU19GSUxFX05BTUUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdwcmlzbWEnKTtcbiAgfVxuXG4gIC8qKiBCbGl0eiByZXBvc2l0b3JpZXMga2VlcCB0aGVpciBQcmlzbWEgc2NoZW1hIGFuZCBTUUxpdGUgZGF0YWJhc2VzIHVuZGVyIGRiLyBpbnN0ZWFkIG9mIHByaXNtYS8uICovXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmlzbWFEaXJOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSkgPyAnZGInIDogJ3ByaXNtYSc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1R5cGVBd2FyZU94bGludCgpOiBib29sZWFuIHtcbiAgICAvLyBPeGxpbnQncyB0eXBlLWF3YXJlIG1vZGUgcmVxdWlyZXMgdGhlIG94bGludC10c2dvbGludCBiaW5hcnkuXG4gICAgcmV0dXJuIHRoaXMuaGFzT3hsaW50ICYmIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hsaW50LXRzZ29saW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hmbXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hmbXQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmV0dGllcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdwcmV0dGllcicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQ2FyZ29Ub21sKCk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgdGhlIHByb2plY3QncyBvd24gZGlyZWN0b3J5IGlzIGNoZWNrZWQgYmVjYXVzZSBgY2FyZ28gZm10IC0tYWxsYFxuICAgIC8vIGNvdmVycyB0aGUgd2hvbGUgd29ya3NwYWNlOyBtYXRjaGluZyB0aGUgcm9vdCBkaXJlY3RvcnkgdG9vIHdvdWxkIG1ha2VcbiAgICAvLyBldmVyeSBkZXNjZW5kYW50IHByb2plY3QgcnVuIHRoZSBzYW1lIHdvcmtzcGFjZS13aWRlIGNvbW1hbmQgaW5cbiAgICAvLyBwYXJhbGxlbC5cbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnQ2FyZ28udG9tbCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIFBsYXl3cmlnaHQgY29uZmlnIGRlY2xhcmVzIGEgYHdlYlNlcnZlcmAgYmxvY2ssIGkuZS4gUGxheXdyaWdodCBpdHNlbGYgYnVpbGRzIGFuZFxuICAgKiBzdGFydHMgdGhlIGFwcCB1bmRlciB0ZXN0LiBVbmxpa2Uge0BsaW5rIHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0fSB0aGlzIGlnbm9yZXMgQ0ksIHNvXG4gICAqIGl0IGFsc28gaG9sZHMgZm9yIGxpYnJhcnkgZml4dHVyZXMgd2hvc2Ugb25seSBzZXJ2ZXIgaXMgdGhlIG9uZSBQbGF5d3JpZ2h0IG1hbmFnZXMuXG4gICAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodFdlYlNlcnZlckNvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIC8vIE9uIENJIHdiIGxhdW5jaGVzIHRoZSBhcHAgaXRzZWxmIHNvIHRoZSBydW4gZG9lcyBub3QgZGVwZW5kIG9uIFBsYXl3cmlnaHQncyBgcmV1c2VFeGlzdGluZ1NlcnZlcmBcbiAgICAvLyAod2hpY2ggaXMgZGlzYWJsZWQgb24gQ0kpOyBsb2NhbGx5LCBhIGB3ZWJTZXJ2ZXJgIGJsb2NrIG1lYW5zIFBsYXl3cmlnaHQgYWxyZWFkeSBvd25zIHRoZSBzZXJ2ZXIuXG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGxheXdyaWdodFdlYlNlcnZlckNvbmZpZztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgY29uc3QgZG9ja2VyZmlsZURpclBhdGggPSBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKTtcbiAgICByZXR1cm4gZG9ja2VyZmlsZURpclBhdGggPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZG9ja2VyZmlsZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKHRoaXMuZGlyUGF0aCwgdGhpcy5lbnYpO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3UGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByYXdQYXRoLnN0YXJ0c1dpdGgoJy8vJykgPyByYXdQYXRoLnNsaWNlKDIpIDogcmF3UGF0aDtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoIHx8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4gJiBQYXJ0aWFsPFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3Jvb3REaXJQYXRoJz4+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSkgcmV0dXJuIGRiUGF0aDtcblxuICBjb25zdCBiYXNlRGlyUGF0aCA9IHByb2plY3Qucm9vdERpclBhdGggPz8gcHJvamVjdC5kaXJQYXRoO1xuICByZXR1cm4gYmFzZURpclBhdGggPyBwYXRoLnJlc29sdmUoYmFzZURpclBhdGgsIGRiUGF0aCkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIHByb2plY3QncyBlbnYgc291cmNlcyBhbmQgbWVyZ2VzIHRoZW0gb3ZlciBwcm9jZXNzLmVudiwgcmVwb3J0aW5nIGVhY2ggbG9hZGVkIHNvdXJjZS5cbiAqIFNoYXJlZCBieSBQcm9qZWN0LmVudiBhbmQgYHdiIHJ1bmAncyBzdGFuZGFsb25lIChtYW5pZmVzdC1sZXNzKSBlbnZpcm9ubWVudCBsb2FkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGRpclBhdGg6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBkaXJQYXRoLCB7XG4gICAgLy8gQ2FsbGVycyBmaWxsIGFuIHVuc2V0IFdCX0VOViB3aXRoIHRoZSBzYW1lIGZhbGxiYWNrIGFmdGVyd2FyZHMsIHNvIGV4cGFuZGluZyAke1dCX0VOVn1cbiAgICAvLyByZWZlcmVuY2VzIGFnYWluc3QgaXQga2VlcHMgdGhlIHBhaXIgY29uc2lzdGVudC5cbiAgICBleHBhbmRGYWxsYmFja1diRW52OiB0cnVlLFxuICB9KTtcbiAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3YpKSB7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgbmFtZXNdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7bmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG4gIC8vIFNwcmVhZGluZyBlbnZWYXJzIGxhc3QgaXMgc2FmZSBmb3IgZXhwb3J0ZWQtdmFyaWFibGUgcHJlY2VkZW5jZTogcmVhZEVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGFscmVhZHkgZXhjbHVkZXMga2V5cyBwcmVzZW50IGluIHByb2Nlc3MuZW52IGZyb20gLmVudi9mbm94IHNvdXJjZXMgKHJldHVybmluZyBhIGtleSB0aGF0XG4gIC8vIGV4aXN0cyBpbiBwcm9jZXNzLmVudiBvbmx5IGZvciBkZWxpYmVyYXRlIGZvcmNlZC1tb2RlIG92ZXJyaWRlcykuIE1pc2UgdmFsdWVzIHRoYXRcbiAgLy8gZGlmZmVyIGZyb20gdGhlIGFtYmllbnQgYWN0aXZhdGlvbiBhcmUgZGVsaWJlcmF0ZWx5IGtlcHQgc28gdGhlIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGVcbiAgLy8gKGUuZy4gYC0tY2FzY2FkZS1lbnY9dGVzdGApIHdpbnMgb3ZlciBhIHN0YWxlIGBtaXNlIGFjdGl2YXRlYCBlbnZpcm9ubWVudC5cbiAgcmV0dXJuIFt7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH0sIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnNdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG4vLyBQcm9qZWN0IGNvbnN0cnVjdGlvbiByZS1yZWFkcyBtYW5pZmVzdHMgYW5kIGVudiBzb3VyY2VzLCBhbmQgYHdiIHZlcmlmeWAgY29tcG9zZXMgY29tbWFuZHNcbi8vIChsaW50LCB0eXBlY2hlY2ssIHRlc3QpIHRoYXQgZWFjaCByZWJ1aWxkIHRoZSBncmFwaCDigJQgc28gaW5zdGFuY2VzIGFyZSBzaGFyZWQgcGVyXG4vLyAoZGlyZWN0b3J5LCBsb2FkRW52LCBlbnYtcmVsZXZhbnQgYXJndikgd2l0aGluIG9uZSBpbnZvY2F0aW9uLiBTaGFyaW5nIGlzIHNhZmUgYmVjYXVzZSBhXG4vLyBQcm9qZWN0IGlzIGltbXV0YWJsZSBleGNlcHQgZm9yIGVudiBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IC4uLmApLCB3aGljaCBjYWxsZXJzXG4vLyBkZWxpYmVyYXRlbHkgcmVseSBvbiBzdGF5aW5nIHZpc2libGUgdG8gbGF0ZXIgc3RlcHMuIFRoZSBjYWNoZXMgbGl2ZSBmb3IgdGhlIHdob2xlIHByb2Nlc3MgYW5kXG4vLyBuZXZlciBvYnNlcnZlIGxhdGVyIGZpbGVzeXN0ZW0gbXV0YXRpb25zLCBzbyBjb2RlIHRoYXQgcmV3cml0ZXMgYSBwcm9qZWN0IGRpcmVjdG9yeSBhbmQgbmVlZHMgYVxuLy8gZnJlc2ggdmlldyAodG9kYXkgb25seSB0ZXN0cykgbXVzdCBjYWxsIGNsZWFyUHJvamVjdENhY2hlcyBmaXJzdC5cbmNvbnN0IHNlbGZQcm9qZWN0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvamVjdD4oKTtcbmNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0c0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UHJvamVjdFtdPj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUHJvamVjdENhY2hlcygpOiB2b2lkIHtcbiAgc2VsZlByb2plY3RDYWNoZS5jbGVhcigpO1xuICBkZXNjZW5kYW50UHJvamVjdHNDYWNoZS5jbGVhcigpO1xuICBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb2plY3RDYWNoZUtleShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPbmx5IHRoZSBpbnB1dHMgYSBQcm9qZWN0IGFjdHVhbGx5IHJlYWRzIHBhcnRpY2lwYXRlOiB0aGUgZW52IGNhc2NhZGUgc2VsZWN0aW9uXG4gIC8vIChyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgLyByZXNvbHZlRmFsbGJhY2tXYkVudiAvIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudikgYW5kIHRoZSBvdXRwdXRcbiAgLy8gc3dpdGNoZXMgKHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQsIGJ1aWxkQ29tbWFuZCdzIC0tdmVyYm9zZSkuIFRoZSBhbWJpZW50XG4gIC8vIFdCX0VOViAvIE5PREVfRU5WIC8gQ0kgdmFsdWVzIGZlZWQgdGhlIHNhbWUgY2FzY2FkZSBzZWxlY3Rpb24gYW5kIGFyZSBtdXRhdGVkIG1pZC1ydW4gYnlcbiAgLy8gY29tbWFuZHMgc3VjaCBhcyBgd2IgZGIgcmVzZXRgICh3aGljaCBmb3JjZXMgV0JfRU5WPXRlc3QgYW5kIHJlLXJlc29sdmVzIHByb2plY3RzKSwgc28gdGhleVxuICAvLyBtdXN0IHBhcnRpY2lwYXRlIHRvbyBvciB0aGUgc2Vjb25kIHJlc29sdXRpb24gd291bGQgcmV1c2UgYSBQcm9qZWN0IHdpdGggdGhlIHdyb25nIGVudi5cbiAgY29uc3QgeyBhdXRvQ2FzY2FkZUVudiwgY2FzY2FkZUVudiwgY2FzY2FkZU5vZGVFbnYsIGNvbW1hbmREZWZhdWx0V2JFbnYsIHF1aWV0RW52LCB2ZXJib3NlIH0gPSBhcmd2O1xuICBjb25zdCB7IHNpbGVudCB9ID0gYXJndiBhcyB7IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICBwYXRoLnJlc29sdmUoZGlyUGF0aCksXG4gICAgbG9hZEVudixcbiAgICBhdXRvQ2FzY2FkZUVudixcbiAgICBjYXNjYWRlRW52LFxuICAgIGNhc2NhZGVOb2RlRW52LFxuICAgIGNvbW1hbmREZWZhdWx0V2JFbnYsXG4gICAgcXVpZXRFbnYsXG4gICAgdmVyYm9zZSxcbiAgICBzaWxlbnQsXG4gICAgcHJvY2Vzcy5lbnYuV0JfRU5WLFxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgIHByb2Nlc3MuZW52LkNJLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCBjYWNoZUtleSA9IGJ1aWxkUHJvamVjdENhY2hlS2V5KGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBsZXQgcHJvamVjdCA9IHNlbGZQcm9qZWN0Q2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIHNlbGZQcm9qZWN0Q2FjaGUuc2V0KGNhY2hlS2V5LCBwcm9qZWN0KTtcbiAgfVxuICByZXR1cm4gcHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvamVjdC5lbnYuV0JfRU5WID09PSBuYW1lIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WID09PSBuYW1lO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuICBpZiAocm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ICE9PSByb290QW5kU2VsZlByb2plY3RzLnNlbGYpIHtcbiAgICByZXR1cm4geyAuLi5yb290QW5kU2VsZlByb2plY3RzLCBkZXNjZW5kYW50czogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0gfTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlS2V5ID0gYnVpbGRQcm9qZWN0Q2FjaGVLZXkoYXJndiwgbG9hZEVudiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LmRpclBhdGgpO1xuICBsZXQgZGVzY2VuZGFudHMgPSBkZXNjZW5kYW50UHJvamVjdHNDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICBpZiAoIWRlc2NlbmRhbnRzKSB7XG4gICAgZGVzY2VuZGFudHMgPSBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KTtcbiAgICBkZXNjZW5kYW50UHJvamVjdHNDYWNoZS5zZXQoY2FjaGVLZXksIGRlc2NlbmRhbnRzKTtcbiAgfVxuICByZXR1cm4geyAuLi5yb290QW5kU2VsZlByb2plY3RzLCBkZXNjZW5kYW50czogYXdhaXQgZGVzY2VuZGFudHMgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXRoaXNQcm9qZWN0KSByZXR1cm47XG5cbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgcm9vdFByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgbG9hZEVudiwgcm9vdERpclBhdGgpID8/IHRoaXNQcm9qZWN0O1xuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG4vKipcbiAqIFRoZSByb290IHByb2plY3QgZm9sbG93ZWQgYnkgb25lIFByb2plY3QgcGVyIHdvcmtzcGFjZSBkaXJlY3RvcnkgdGhlIHRhcmdldCByZXBvc2l0b3J5J3NcbiAqIHBhY2thZ2UgbWFuYWdlciB3b3VsZCBsaW5rIChpc3N1ZSAjMTAwOCk6IEJ1biByZXBvcyB1c2UgdGhlIHNoYXJlZCBCdW4tZXhhY3QgcmVzb2x2ZXJcbiAqIChuZWdhdGlvbnMsIHBpbm5lZCBwb3NpdGl2ZXMsIGFuZCBiYXNlbGluZS1zZWVkaW5nIG5lZ2F0aW9ucyBpbmNsdWRlZCksIHdoaWxlIFlhcm4gcmVwb3Mga2VlcFxuICogZ2xvYiBzZW1hbnRpY3Mg4oCUIEJ1bi1vbmx5IHJ1bGVzIHN1Y2ggYXMgdGhlIGltcGxpY2l0IGJhc2VsaW5lIHdvdWxkIGludmVudCB3b3Jrc3BhY2VzIFlhcm5cbiAqIG5ldmVyIGxpbmtzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290UHJvamVjdCk7XG4gIHJldHVybiBbXG4gICAgcm9vdFByb2plY3QsXG4gICAgLi4ud29ya3NwYWNlRGlyUGF0aHMubWFwKFxuICAgICAgLy8gVGhlIGZhbGxiYWNrIGtlZXBzIGEgd29ya3NwYWNlIHdob3NlIG1hbmlmZXN0IHZhbmlzaGVkIGFmdGVyIHRoZSBnbG9iIChmaW5kU2VsZlByb2plY3RcbiAgICAgIC8vIHdvdWxkIGRyb3AgaXQpIGRpc2NvdmVyZWQsIG1hdGNoaW5nIHRoZSBsb25nLXN0YW5kaW5nIGRpcmVjdCBjb25zdHJ1Y3Rpb24uXG4gICAgICAod29ya3NwYWNlRGlyUGF0aCkgPT5cbiAgICAgICAgZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIHdvcmtzcGFjZURpclBhdGgpID8/IG5ldyBQcm9qZWN0KHdvcmtzcGFjZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpXG4gICAgKSxcbiAgXTtcbn1cblxuLyoqXG4gKiBUaGUgYWJzb2x1dGUgZGlyZWN0b3J5IG9mIGV2ZXJ5IHdvcmtzcGFjZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayxcbiAqIG1hdGNoaW5nIHRoZSBtYW5hZ2VyIHRoZSB3YXkgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIGRlc2NyaWJlcy4gRXhwb3J0ZWQgZm9yIHdiIHJlbGVhc2UsIHdob3NlXG4gKiBwbHVnaW4gaW5zcGVjdGlvbiwgbm9kZV9tb2R1bGVzIGNsZWFudXAsIGFuZCBtYW5pZmVzdCByZXdyaXRpbmcgbXVzdCBzZWUgdGhlIHNhbWUgd29ya3NwYWNlIHNldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nIHwgJ3VzZXNCdW5QYWNrYWdlTWFuYWdlcic+XG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcikge1xuICAgIHJldHVybiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMsIHByb2plY3QuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICApO1xuICB9XG4gIC8vIFlhcm4gMS4yMi4yMiByZXNvbHZlcyBlYWNoIGRlY2xhcmVkIHBhdHRlcm4gKGFycmF5IG9yIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBmb3JtKSBpbmRlcGVuZGVudGx5XG4gIC8vIGFuZCB1bmlvbnMgdGhlIHJlc3VsdHMsIHNvIGEgbGVhZGluZy1gIWAgcGF0dGVybiBpcyBub3QgYW4gZXhjbHVzaW9uIOKAlCBgW1wicGFja2FnZXMvKlwiLFxuICAvLyBcIiFwYWNrYWdlcy9hXCJdYCBzdGlsbCBsaW5rcyBwYWNrYWdlcy9hLiBZYXJuIGFkZGl0aW9uYWxseSBpZ25vcmVzIG1hbmlmZXN0cyBtaXNzaW5nIGEgbmFtZSBvclxuICAvLyB2ZXJzaW9uIChcIk1pc3NpbmcgdmVyc2lvbiBpbiB3b3Jrc3BhY2Ug4oCmLCBpZ25vcmluZy5cIiksIGJ1dCB0aGF0IGlzIGRlbGliZXJhdGVseSBOT1QgbWlycm9yZWQ6XG4gIC8vIHdiJ3MgZGVzY2VuZGFudCBkaXNjb3ZlcnkgZXhpc3RzIHRvIHJ1biBjb21tYW5kcyAobGludCwgdGVzdCwgdHlwZWNoZWNrLCDigKYpIGluIHN1Yi1wYWNrYWdlcyxcbiAgLy8gYW5kIHZlcnNpb24tbGVzcyBwcml2YXRlIHBhY2thZ2VzIG11c3Qgc3RheSBkaXNjb3ZlcmVkIOKAlCB0aGUgbG9uZy1zdGFuZGluZyBiZWhhdmlvciB3YidzXG4gIC8vIG1vbm9yZXBvIGZpeHR1cmVzIGVuY29kZS4gR2xvYiBmb3IgdGhlIG1hbmlmZXN0cyB0aGVtc2VsdmVzOiBnbG9iYnkncyBgb25seURpcmVjdG9yaWVzYFxuICAvLyB3b3VsZCByZXR1cm4gYSBsaXRlcmFsIGRpcmVjdG9yeSBwYXR0ZXJuJ3MgQ0hJTERSRU4gaW5zdGVhZCBvZiB0aGUgZGlyZWN0b3J5LiBUaGUgcmVhbHBhdGhcbiAgLy8gY29udGFpbm1lbnQgbWlycm9ycyByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRoczogYSB3b3Jrc3BhY2Ugc3ltbGluayBlc2NhcGluZyB0aGVcbiAgLy8gcmVwb3NpdG9yeSBtdXN0IG5vdCBsZXQgY29uc3VtZXJzIHRvdWNoIGFub3RoZXIgY2hlY2tvdXQuXG4gIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykuZmlsdGVyKFxuICAgIChwYXR0ZXJuKSA9PiAhcGF0dGVybi5zdGFydHNXaXRoKCchJykgJiYgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHBhdHRlcm4pXG4gICk7XG4gIGlmIChwb3NpdGl2ZVBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAvLyBleHBhbmREaXJlY3RvcmllczogZmFsc2Ug4oCUIGdsb2JieSB3b3VsZCBvdGhlcndpc2UgZXhwYW5kIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybiB0byBpdHNcbiAgLy8gQ0hJTERSRU4sIHR1cm5pbmcgZS5nLiBgcGFja2FnZXNgIGludG8gbWF0Y2hlcyBmb3IgZXZlcnkgcGFja2FnZXMvKiBzdWJkaXJlY3RvcnkuXG4gIGNvbnN0IGdsb2JieU9wdGlvbnMgPSB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgfTtcbiAgLy8gZmFzdC1nbG9iIChnbG9iYnkncyBlbmdpbmUpIHJldHVybnMgbm8gbWF0Y2hlcyBmb3IgZmlsZSBnbG9icyB3aXRoIGEgbG9uZS1gP2Agc2VnbWVudCAoZS5nLlxuICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSBhbHRob3VnaCBZYXJuIGxpbmtzIHN1Y2ggd29ya3NwYWNlczsgZm9yIGA/YC1jYXJyeWluZyBwYXR0ZXJuc1xuICAvLyBvbmx5IChhIGRpcmVjdG9yeSBnbG9iIGZvciBlLmcuIGAqKmAgd291bGQgc2NhbiBldmVyeSBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZ1xuICAvLyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYi5cbiAgY29uc3QgZ2xvYmJlZE1hbmlmZXN0UGF0aHMgPSBhd2FpdCBnbG9iYnkoXG4gICAgcG9zaXRpdmVQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHBhdGgucG9zaXguam9pbihwYXR0ZXJuLCAncGFja2FnZS5qc29uJykpLFxuICAgIGdsb2JieU9wdGlvbnNcbiAgKTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoU2V0ID0gbmV3IFNldChnbG9iYmVkTWFuaWZlc3RQYXRocyk7XG4gIGNvbnN0IHF1ZXN0aW9uTWFya1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJz8nKSk7XG4gIGlmIChxdWVzdGlvbk1hcmtQYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGF3YWl0IGdsb2JieShxdWVzdGlvbk1hcmtQYXR0ZXJucywgeyAuLi5nbG9iYnlPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtYW5pZmVzdFBhdGgpKSkgbWFuaWZlc3RQYXRoU2V0LmFkZChtYW5pZmVzdFBhdGgpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYW5pZmVzdFBhdGhzID0gWy4uLm1hbmlmZXN0UGF0aFNldF07XG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhwcm9qZWN0LmRpclBhdGgpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG1hbmlmZXN0UGF0aHNcbiAgICAvLyBBIGAqKmAgcGF0dGVybiByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0IGFuZCBpbnN0YWxsZWQgcGFja2FnZXMsIGJ1dCBuZWl0aGVyIGlzIGFcbiAgICAvLyB3b3Jrc3BhY2UgdG8gWWFybiAod2hpY2ggbmV2ZXIgZGVzY2VuZHMgaW50byBub2RlX21vZHVsZXMpLlxuICAgIC5maWx0ZXIoKG1hbmlmZXN0UGF0aCkgPT4ge1xuICAgICAgaWYgKG1hbmlmZXN0UGF0aCA9PT0gJ3BhY2thZ2UuanNvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpO1xuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBtYW5pZmVzdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbDogbm90IGEgd29ya3NwYWNlLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgICAubWFwKChtYW5pZmVzdFBhdGgpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShtYW5pZmVzdFBhdGgpKSk7XG4gIHJldHVybiBbLi4ubmV3IFNldCh3b3Jrc3BhY2VEaXJQYXRocyldLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgLmdpdGlnbm9yZSBjYXJyaWVzIHdiZnkncyBtYW5hZ2VkIHJ1bGUgZm9yIHRoZSBmaWxlLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYGdpdCBjaGVjay1pZ25vcmVgOiB0aGF0IGFsc28gaG9ub3JzIGAuZ2l0L2luZm8vZXhjbHVkZWAgYW5kIHRoZSB1c2VyJ3MgZ2xvYmFsXG4gKiBleGNsdWRlcywgd2hpY2ggYSBmcmVzaCBjbG9uZSBhbmQgQ0kgZG8gbm90IGhhdmUuIEEgZGV2ZWxvcGVyIHdpdGggYSBwZXJzb25hbFxuICogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGV4Y2x1ZGUgd291bGQgb3RoZXJ3aXNlIHR1cm4gZ2VuZXJhdGlvbiBvbiBmb3IgYSBwYWNrYWdlIHdiZnlcbiAqIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRoZSByZXN1bHRpbmcgZmlsZSB3b3VsZCBiZSBpbnZpc2libGUgaW4gYGdpdCBzdGF0dXNgLlxuICogYHBhY2thZ2VzL3diZnkvc3JjL2ZpeGVycy93b3JrZXJUeXBlcy50c2AgZ2F0ZXMgb24gdGhlIHNhbWUgY29tbWl0dGVkIHJ1bGUuXG4gKi9cbmZ1bmN0aW9uIGhhc01hbmFnZWRHaXRpZ25vcmVSdWxlKGRpclBhdGg6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXRpZ25vcmUnKSwgJ3V0ZjgnKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLnNvbWUoKGxpbmUpID0+IGxpbmUudHJpbSgpID09PSBgLyR7ZmlsZU5hbWV9YCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBwYWNrYWdlIHNjcmlwdCBydW5zIGEgYHdyYW5nbGVyIHR5cGVzYCB0aGF0IHdvdWxkIHdyaXRlIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgdGhlIGJhcmVcbiAqIGludm9jYXRpb24gd3JpdGVzLiBgLS1jaGVja2AvYC0taGVscGAgdmFsaWRhdGUgb3IgcHJpbnQgYW5kIHdyaXRlIG5vdGhpbmcsIHNvIHRoZXkgZG8gbm90IGNvdW50LiBgLS1lbnYtZmlsZWBcbiAqIGNvdW50cyB3aGVuZXZlciBhIGZpbGUgaXQgbmFtZXMgRVhJU1RTOiB0aGUgZmxhZyBzZWxlY3RzIHdoYXQgd3JhbmdsZXIgcmVhZHMgdG8gaW5mZXIgbG9jYWwgdmFycyBhbmQgc2VjcmV0cyxcbiAqIHNvIHRoZSBiYXJlIGludm9jYXRpb24gaGVyZSB3b3VsZCByZWdlbmVyYXRlIGEgc21hbGxlciBgRW52YC4gTWlycm9ycyB3YmZ5J3MgYGhhc0N1c3RvbVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uYFxuICogKGluY2x1ZGluZyBpdHMgYG5hbWVzT25seU1pc3NpbmdFbnZGaWxlc2AgcnVsZSk7IHRoZSB0d28gbXVzdCBhZ3JlZSwgc2luY2Ugd2JmeSdzIGFuc3dlciBkZWNpZGVzIHRoZVxuICogZ2l0aWdub3JlIHJ1bGUgdGhpcyBwcmVkaWNhdGUga2V5cyBvbi5cbiAqL1xuZnVuY3Rpb24gaGFzT3V0cHV0Q2hhbmdpbmdXcmFuZ2xlclR5cGVzKHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB3cmFuZ2xlclR5cGVzUGF0dGVybiA9IC8oPzpefFxccyl3cmFuZ2xlclxccyt0eXBlcyg/Olxcc3wkKS91O1xuICBjb25zdCBlbnZGaWxlT25seVBhdHRlcm4gPSAvXig/Oig/OmJ1bnh8bnB4KVxccyt8KD86eWFybnxwbnBtKVxccytkbHhcXHMrKT93cmFuZ2xlclxccyt0eXBlcyg/OlxccystLWVudi1maWxlXFxzK1xcUyspKiQvdTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB7XG4gICAgaWYgKCFzY3JpcHQgfHwgIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIENoZWNrZWQgb24gdGhlIFdIT0xFIHNjcmlwdCwgYmVmb3JlIHNwbGl0dGluZzogYGNkIHN1YiAmJiB3cmFuZ2xlciB0eXBlc2AgcnVucyB0aGUgZ2VuZXJhdG9yIGluIGFub3RoZXJcbiAgICAvLyBkaXJlY3RvcnkgYWdhaW5zdCBhbm90aGVyIGNvbmZpZywgYnV0IGl0cyBzZWNvbmQgc2VnbWVudCBhbG9uZSBsb29rcyBsaWtlIGEgcGxhaW4gaW52b2NhdGlvbi4gd2JmeVxuICAgIC8vIGNsYXNzaWZpZXMgYW55IHNjcmlwdCBjYXJyeWluZyB0aGlzIHN5bnRheCBhcyBjdXN0b20sIGFuZCB0aGUgdHdvIHByZWRpY2F0ZXMgbXVzdCBhZ3JlZS5cbiAgICBpZiAoL1s7fDw+YCQnXCIoKV18XFxiY2RcXHMvdS50ZXN0KHNjcmlwdCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBzY3JpcHRcbiAgICAgIC5zcGxpdCgnJiYnKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSlcbiAgICAgIC5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmICghd3JhbmdsZXJUeXBlc1BhdHRlcm4udGVzdChzZWdtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoLyg/Ol58XFxzKSg/Oi0taGVscHwtaCkoPzpcXHN8PXwkKS91LnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYC0tY2hlY2tgIGNvbXBhcmVzIHRoZSByZXN1bHQgRk9SIFRIRSBTVVBQTElFRCBPUFRJT05TLCBzbyBpdCBpcyBvbmx5IGhhcm1sZXNzIHdoZW4gdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgIC8vIGludm9jYXRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBvbmUuXG4gICAgICAgIGNvbnN0IHdpdGhvdXRDaGVjayA9IHNlZ21lbnRcbiAgICAgICAgICAucmVwbGFjZSgvKD86XnxcXHMpLS1jaGVjayg/Olxcc3w9fCQpL3UsICcgJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhvdXRDaGVjayA9PT0gc2VnbWVudCA/IHNlZ21lbnQgOiB3aXRob3V0Q2hlY2s7XG4gICAgICAgIC8vIE5vdCBlcXVpdmFsZW50IHRvIHRoZSBiYXJlIGludm9jYXRpb24sIHdpdGggb3Igd2l0aG91dCBgLS1jaGVja2A6IGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUlxuICAgICAgICAvLyBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gYC0tY2hlY2sgLS1zdHJpY3QtdmFycz1mYWxzZWAgc3RpbGwgZGVzY3JpYmVzIGEgZGlmZmVyZW50IGZpbGUuXG4gICAgICAgIGlmICghZW52RmlsZU9ubHlQYXR0ZXJuLnRlc3QoY2FuZGlkYXRlKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBbLi4uY2FuZGlkYXRlLm1hdGNoQWxsKC8tLWVudi1maWxlXFxzKyhcXFMrKS9ndSldLnNvbWUoXG4gICAgICAgICAgKG1hdGNoKSA9PiAhIW1hdGNoWzFdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIG1hdGNoWzFdKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0J1aWxkIG91dHB1dCBwYXRocyAocmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5KSB0aGF0IG11c3QgZXhpc3QgZm9yIHRoZSBjYWNoZSB0byBiZSB2YWxpZCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZCBjb21tb24gb3V0cHV0IGRpcmVjdG9yaWVzKScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBidWlsZENvbW1hbmQgPVxuICAgIGFyZ3YuY29tbWFuZCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBidWlsZGAgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIC8vIFRoZSBjYWNoZSByZXF1aXJlcyB0aGUgZ2l0IHJlcG9zaXRvcnkgcm9vdCB0byBCRSByb290RGlyUGF0aDogcG9yY2VsYWluIHBhdGhzIGFuZCBkaWZmXG4gIC8vIHBhdGhzcGVjcyBiZWxvdyBhcmUgam9pbmVkL2V4ZWN1dGVkIGFnYWluc3Qgcm9vdERpclBhdGguIFdoZW4gdGhlIHJlcG8gcm9vdCBpcyBlbHNld2hlcmVcbiAgLy8gKGUuZy4gYSBzdWJwcm9qZWN0IG9mIGEgbGFyZ2VyIHJlcG9zaXRvcnkpLCBhbHdheXMgYnVpbGQgaW5zdGVhZCBvZiBtaXMtcmVzb2x2aW5nIHBhdGhzLlxuICAvLyBBIGZyZXNobHkgaW5pdGlhbGl6ZWQgcmVwbyB3aXRob3V0IGNvbW1pdHMgKHVuYm9ybiBIRUFEKSBsaWtld2lzZSBidWlsZHMgd2l0aG91dCBjYWNoaW5nOlxuICAvLyByZXNvbHZpbmcgSEVBRCB3b3VsZCBmYWlsLlxuICBjb25zdCBjb21taXRIYXNoID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkgPyBnZXRHaXRDb21taXRIYXNoKHByb2plY3QpIDogdW5kZWZpbmVkO1xuICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndiwgY29tbWl0SGFzaCk7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aHMgPSBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3QpO1xuICAgIGlmIChvdXRwdXRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFdpdGggbm8gcmVjb3JkZWQgb3V0cHV0cywgYSBkZWxldGVkIGJ1aWxkIGRpcmVjdG9yeSBjYW4gbmV2ZXIgaW52YWxpZGF0ZSB0aGUgY2FjaGU7IG1ha2VcbiAgICAgIC8vIHRoZSBpbmFjdGl2ZSBwcm90ZWN0aW9uIHZpc2libGUgaW5zdGVhZCBvZiBmYWlsaW5nIHNpbGVudGx5IChjZi4gaXNzdWUgIzk4MSkuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdygnTm8gYnVpbGQgb3V0cHV0IGRpcmVjdG9yeSBkZXRlY3RlZDsgcGFzcyAtLW91dHB1dCB0byBlbmFibGUgbWlzc2luZy1vdXRwdXQgY2FjaGUgaW52YWxpZGF0aW9uLicpXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoeyBoYXNoOiBjb250ZW50SGFzaCwgb3V0cHV0UGF0aHMgfSksICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIENvbW1vbiBidWlsZCBvdXRwdXQgZGlyZWN0b3JpZXMgdXNlZCBhY3Jvc3Mgb3JnIHByb2plY3RzICh2aW5leHQvYnVpbGQtdHMgZW1pdCBkaXN0LFxuLy8gTmV4dC5qcyBlbWl0cyAubmV4dCwgQ1JBLXN0eWxlIGFwcHMgZW1pdCBidWlsZCwgYG5leHQgZXhwb3J0YCBlbWl0cyBvdXQpLlxuY29uc3QgZGVmYXVsdE91dHB1dENhbmRpZGF0ZXMgPSBbJ2Rpc3QnLCAnYnVpbGQnLCAnLm5leHQnLCAnb3V0J107XG5cbmZ1bmN0aW9uIGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGFyZ3Yub3V0cHV0Py5sZW5ndGggPyBhcmd2Lm91dHB1dC5tYXAoU3RyaW5nKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0RXhpc3RpbmdEZWZhdWx0T3V0cHV0UGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzLmZpbHRlcigob3V0cHV0UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBvdXRwdXRQYXRoKSkpO1xufVxuXG4vKiogQW4gYC0tb3V0cHV0YCB2YWx1ZSBtYXkgbmFtZSBhIGZpbGUsIHNvIG1hdGNoIHRoZSBleGFjdCBwYXRoIGFzIHdlbGwgYXMgZGVzY2VuZGFudHMuICovXG5mdW5jdGlvbiBtYXRjaGVzT3V0cHV0UGF0aChvdXRwdXRQYXRoczogc3RyaW5nW10sIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG91dHB1dFBhdGhzLnNvbWUoKG91dHB1dFBhdGgpID0+IGZpbGVQYXRoID09PSBvdXRwdXRQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7b3V0cHV0UGF0aH0vYCkpO1xufVxuXG4vKiogVGhlIEhFQUQgY29tbWl0IGhhc2gsIG9yIHVuZGVmaW5lZCBvbiBhbiB1bmJvcm4gSEVBRCAoYSByZXBvIHdpdGhvdXQgY29tbWl0cykuICovXG5mdW5jdGlvbiBnZXRHaXRDb21taXRIYXNoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAnSEVBRCddLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICB9KTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPT09IDAgPyByZXQuc3Rkb3V0LnRyaW0oKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBjb21taXRIYXNoOiBzdHJpbmdcbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIC8vIFRoZSBpbnZva2VkIGJ1aWxkIGNvbW1hbmQgaXMgcGFydCBvZiB0aGUgY2FjaGUgaWRlbnRpdHk6IGAtYyBjb21tYW5kQmAgbXVzdCBub3QgcmV1c2UgYVxuICAvLyBjYWNoZSByZWNvcmRlZCBmb3IgY29tbWFuZEEgd2l0aCBvdGhlcndpc2UgdW5jaGFuZ2VkIGlucHV0cy5cbiAgaGFzaC51cGRhdGUoYXJndi5jb21tYW5kID8/ICcnKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgY29uc3QgY2FjaGUgPSBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudCk7XG4gIGlmIChjYWNoZT8uaGFzaCAhPT0gY29udGVudEhhc2gpIHJldHVybiBbZmFsc2UsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcblxuICAvLyBUaGUgY2FjaGUgaXMgdmFsaWQgb25seSB3aGlsZSB0aGUgcmVjb3JkZWQgKG9yIGV4cGxpY2l0bHkgcmVxdWVzdGVkKSBidWlsZCBvdXRwdXRzIHN0aWxsXG4gIC8vIGV4aXN0OiBhIGRlbGV0ZWQgb3V0cHV0IGRpcmVjdG9yeSAoZS5nLiBgcm0gLXJmIGRpc3RgKSBtdXN0IHRyaWdnZXIgYSByZWJ1aWxkIGV2ZW4gd2hlbiB0aGVcbiAgLy8gaW5wdXRzIGFyZSB1bmNoYW5nZWQgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk4MSkuXG4gIGNvbnN0IHJlcXVpcmVkT3V0cHV0UGF0aHMgPSBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IGNhY2hlLm91dHB1dFBhdGhzO1xuICBjb25zdCBtaXNzaW5nT3V0cHV0UGF0aHMgPSByZXF1aXJlZE91dHB1dFBhdGhzLmZpbHRlcihcbiAgICAob3V0cHV0UGF0aCkgPT4gIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpXG4gICk7XG4gIGlmIChtaXNzaW5nT3V0cHV0UGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFJlYnVpbGRpbmcgYmVjYXVzZSBidWlsZCBvdXRwdXRzIGFyZSBtaXNzaW5nOiAke21pc3NpbmdPdXRwdXRQYXRocy5qb2luKCcsICcpfWApKTtcbiAgICByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG4gIH1cbiAgcmV0dXJuIFt0cnVlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVpbGRDYWNoZShjYWNoZWRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IGhhc2g6IHN0cmluZzsgb3V0cHV0UGF0aHM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZENvbnRlbnQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZENvbnRlbnQpIGFzIHsgaGFzaD86IHVua25vd247IG91dHB1dFBhdGhzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcGFyc2VkPy5oYXNoICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gQXJyYXkuaXNBcnJheShwYXJzZWQub3V0cHV0UGF0aHMpXG4gICAgICA/IHBhcnNlZC5vdXRwdXRQYXRocy5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgIDogW107XG4gICAgcmV0dXJuIHsgaGFzaDogcGFyc2VkLmhhc2gsIG91dHB1dFBhdGhzIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgbGVnYWN5IGNhY2hlIGZpbGUgY29udGFpbnMgYSByYXcgY29udGVudCBoYXNoIHdpdGhvdXQgb3V0cHV0IHJlY29yZHMuIFRyZWF0IGl0IGFzIGEgbWlzczpcbiAgICAvLyBob25vcmluZyBpdCB3b3VsZCBsZXQgYSBtYXRjaGluZyBoYXNoIHNraXAgYSBidWlsZCB3aG9zZSBvdXRwdXRzIHdlcmUgZGVsZXRlZCwgYW5kIG9uZVxuICAgIC8vIHJlYnVpbGQgdXBncmFkZXMgdGhlIHJlY29yZCB0byB0aGUgSlNPTiBmb3JtYXQuXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8vIE1hdGNoZWQgYXMgY29tcGxldGUgcGF0aCBTRUdNRU5UUyAobm90IHN1YnN0cmluZ3MpOiBgc3JjL2NvbnRlc3QvYCBtdXN0IG5vdCBiZSBleGNsdWRlZCBieVxuLy8gYHRlc3RgLCBhbmQgYG15c3JjL2AgbXVzdCBub3QgYmUgaW5jbHVkZWQgYnkgYHNyY2AuXG5jb25zdCBpbmNsdWRlRGlyTmFtZXMgPSBuZXcgU2V0KFsnc3JjJywgJ3B1YmxpYyddKTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbiAgJ2J1bi5sb2NrJyxcbiAgJ2J1bi5sb2NrYicsXG5dO1xuY29uc3QgZXhjbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3Rlc3QnLCAndGVzdHMnLCAnX190ZXN0c19fJywgJ3Rlc3QtZml4dHVyZXMnXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIC8vIGAtdWFsbGAgbGlzdHMgdW50cmFja2VkIGZpbGVzIGluZGl2aWR1YWxseSAobm90IGp1c3QgdGhlaXIgZGlyZWN0b3J5KSwgc28gbmV3IGZpbGVzIGluIGFcbiAgICAvLyBicmFuZC1uZXcgc291cmNlIGRpcmVjdG9yeSBwYXJ0aWNpcGF0ZSBpbiB0aGUgaGFzaCBiZWxvdy4gYC16YCB5aWVsZHMgTlVMLWRlbGltaXRlZCxcbiAgICAvLyBVTlFVT1RFRCByZWNvcmRzOiB3aXRob3V0IGl0IGdpdCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHMsIHdoaWNoIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhvc2VcbiAgICAvLyBmaWxlcyBmcm9tIGJvdGggdGhlIHVudHJhY2tlZCBoYXNoaW5nIGFuZCB0aGUgYGdpdCBkaWZmYCBwYXRoc3BlY3MuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJywgJy11YWxsJywgJy16J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IHRva2VucyA9IHJldC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcigodG9rZW4pID0+IHRva2VuLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IHN0YXR1c0VudHJpZXM6IHsgdW50cmFja2VkOiBib29sZWFuOyBmaWxlUGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgICAgY29uc3Qgc3RhdHVzID0gdG9rZW4uc2xpY2UoMCwgMik7XG4gICAgICBzdGF0dXNFbnRyaWVzLnB1c2goeyB1bnRyYWNrZWQ6IHN0YXR1cyA9PT0gJz8/JywgZmlsZVBhdGg6IHRva2VuLnNsaWNlKDMpIH0pO1xuICAgICAgLy8gUmVuYW1lL2NvcHkgcmVjb3JkcyBjYXJyeSB0aGUgT1JJR0lOQUwgcGF0aCBhcyBhbiBleHRyYSBOVUwtZGVsaW1pdGVkIGZpZWxkOyBpbmNsdWRlIGl0XG4gICAgICAvLyBzbyBhIGZpbGUgcmVuYW1lZCBvdXQgb2YgdGhlIGJ1aWxkIGlucHV0cyBzdGlsbCBpbnZhbGlkYXRlcyB0aGUgY2FjaGUuXG4gICAgICBpZiAoc3RhdHVzLmluY2x1ZGVzKCdSJykgfHwgc3RhdHVzLmluY2x1ZGVzKCdDJykpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxQYXRoID0gdG9rZW5zWysraW5kZXhdO1xuICAgICAgICBpZiAob3JpZ2luYWxQYXRoKSBzdGF0dXNFbnRyaWVzLnB1c2goeyB1bnRyYWNrZWQ6IGZhbHNlLCBmaWxlUGF0aDogb3JpZ2luYWxQYXRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkRW50cmllcyA9IHN0YXR1c0VudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIC4uLmVudHJ5LFxuICAgICAgaGFzaFBhdGg6XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnXG4gICAgICAgICAgPyBlbnRyeS5maWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJylcbiAgICAgICAgICA6IGVudHJ5LmZpbGVQYXRoLFxuICAgIH0pKTtcbiAgICAvLyBCdWlsZCBPVVRQVVRTIG11c3QgbmV2ZXIgY291bnQgYXMgYnVpbGQgaW5wdXRzOiBoYXNoaW5nIGUuZy4gYW4gdW50cmFja2VkIGRpc3QvIGZpbGUgd291bGRcbiAgICAvLyBjaGFuZ2UgdGhlIGhhc2ggb24gZXZlcnkgYnVpbGQgYW5kIGRpc2FibGUgdGhlIGNhY2hlIHBlcm1hbmVudGx5LlxuICAgIGNvbnN0IHByb2plY3RSZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCk7XG4gICAgY29uc3QgZXhwbGljaXRPdXRwdXRQYXRocyA9IChnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IFtdKS5tYXAoKG91dHB1dFBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdFJlbGF0aXZlRGlyUGF0aCwgb3V0cHV0UGF0aClcbiAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IG5vcm1hbGl6ZWRFbnRyaWVzLmZpbHRlcigoeyBmaWxlUGF0aCwgaGFzaFBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgZGlyZWN0b3J5U2VnbWVudHMgPSBoYXNoUGF0aC5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBpbmNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBoYXNoUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWRpcmVjdG9yeVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGV4Y2x1ZGVEaXJOYW1lcy5oYXMoc2VnbWVudCkpICYmXG4gICAgICAgIC8vIE9ubHkgRVhQTElDSVRMWSBkZWNsYXJlZCBvdXRwdXRzIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBpbnB1dCBoYXNoLiBEZWZhdWx0IGNhbmRpZGF0ZXNcbiAgICAgICAgLy8gKGRpc3QvYnVpbGQvLm5leHQvb3V0KSBhcmUgTk9UOiBnaXRpZ25vcmVkIGFydGlmYWN0cyBuZXZlciBhcHBlYXIgaW4gYGdpdCBzdGF0dXNgXG4gICAgICAgIC8vIGFueXdheSwgYW5kIGEgbm9uLWlnbm9yZWQgZmlsZSB0aGVyZSBtYXkgYmUgZ2VudWluZSBzb3VyY2UgKGUuZy4gYnVpbGQvIHNjcmlwdHMpLCB3aG9zZVxuICAgICAgICAvLyBjaGFuZ2VzIG11c3QgaW52YWxpZGF0ZSB0aGUgY2FjaGUg4oCUIGNvcnJlY3RuZXNzIG92ZXIgY2FjaGUgaGl0cy4gUHJvamVjdHMga2VlcGluZ1xuICAgICAgICAvLyBub24taWdub3JlZCBhcnRpZmFjdHMgaW4gdGhvc2UgZGlyZWN0b3JpZXMgc2hvdWxkIGdpdGlnbm9yZSB0aGVtIG9yIHBhc3MgLS1vdXRwdXQuXG4gICAgICAgICFtYXRjaGVzT3V0cHV0UGF0aChleHBsaWNpdE91dHB1dFBhdGhzLCBmaWxlUGF0aClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCkuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBVbnRyYWNrZWQgZmlsZXMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgZGlmZmAsIHNvIGhhc2ggdGhlaXIgY29udGVudHMgZGlyZWN0bHkuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmaWx0ZXJlZEVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkudW50cmFja2VkKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFzaC51cGRhdGUoZW50cnkuaGFzaFBhdGgpO1xuICAgICAgICBoYXNoLnVwZGF0ZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsIGVudHJ5LmZpbGVQYXRoKSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBmaWxlIG1heSB2YW5pc2ggY29uY3VycmVudGx5OyB0aGUgdHJhY2tlZC1zdGF0ZSBkaWZmIGJlbG93IGlzIHVuYWZmZWN0ZWQuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tlZFBhdGhzID0gZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+ICFlbnRyeS51bnRyYWNrZWQpLm1hcCgoZW50cnkpID0+IGVudHJ5Lmhhc2hQYXRoKTtcbiAgICBpZiAodHJhY2tlZFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gYGdpdCBkaWZmIEhFQUQgLS1gIHdpdGggbm8gcGF0aHNwZWMgd291bGQgZGlmZiBFVkVSWSBmaWxlLCBsZXR0aW5nIGV4Y2x1ZGVkIGNoYW5nZXNcbiAgICAgIC8vIChkb2NzLCB0ZXN0cykgaW52YWxpZGF0ZSB0aGUgY2FjaGUuXG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGBnaXQgZGlmZiBIRUFEYCAobm90IHBsYWluIGBnaXQgZGlmZmApIHNvIHN0YWdlZC1vbmx5IGNoYW5nZXMgaW52YWxpZGF0ZSB0aGUgY2FjaGUgdG9vO1xuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aC5cbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJ0hFQUQnLCAnLS0nLCAuLi50cmFja2VkUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBvbWl0U2lsZW50U3RhcnQ/OiBib29sZWFuO1xuICBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyAoYXJndi5zaWxlbnQgPyB0cnVlIDogdW5kZWZpbmVkKSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCAmJiAhb3B0cy5wcmludFJhd091dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPEJ1ZmZlcmVkUnVuUmVzdWx0PiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICBvdXRwdXQ6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiByZXQuc3RhdHVzID8/IDEsXG4gICAgICBvdXRwdXQ6IHJldC5zdGRvdXQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29scyByZXF1aXJpbmdcbiAgLy8gcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgY29uc3QgcHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbCgvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LCAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIHJ1biBidW4gcnVuJywgJ2J1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYgLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZUNvbG9yRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgcHJlc2VydmVDb2xvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGVudi5OT19DT0xPUiAhPT0gdW5kZWZpbmVkIHx8IHByZXNlcnZlQ29sb3IgPT09IGZhbHNlKSB7XG4gICAgLy8gTk9fQ09MT1IgYW5kIHByZXNlcnZlQ29sb3I9ZmFsc2UgYXJlIGV4cGxpY2l0IG5vLWNvbG9yIGNob2ljZXMsIHNvIGluaGVyaXRlZCBGT1JDRV9DT0xPUiBtdXN0IG5vdCBsZWFrIHRocm91Z2guXG4gICAgZGVsZXRlIGVudi5GT1JDRV9DT0xPUjtcbiAgfSBlbHNlIGlmIChwcmVzZXJ2ZUNvbG9yICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBjaGVja0VudkJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGNoZWNrRW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY2hlY2tFbnZCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NoZWNrLWVudicsXG4gIGRlc2NyaWJlOlxuICAgICdWZXJpZnkgdGhhdCBldmVyeSBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBzZWNyZXQgcmVzb2x2ZXMgZm9yIHRoZSBjdXJyZW50IFdCX0VOVi4gUHJlZml4IHNjcmlwdHMgdGhhdCB3cml0ZSB0byByZW1vdGUgZW52aXJvbm1lbnRzIHdpdGggdGhpcyBjb21tYW5kIHRvIGZhaWwgZmFzdCBvbiBtaXNzaW5nIHNlY3JldHMuJyxcbiAgYnVpbGRlcjogY2hlY2tFbnZCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBjaGVja0Vudihhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0VudihcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGNoZWNrRW52QnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgY29uc29sZS5pbmZvKCdObyBmbm94LnRvbWwgZm91bmQ7IG5vdGhpbmcgdG8gY2hlY2suJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVhZGluZyBwcm9qZWN0LmVudiByZXNvbHZlcyBhbmQgdmFsaWRhdGVzIFdCX0VOViAoY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52KSwgc28gdGhlIHByb2ZpbGVcbiAgLy8gYmVsb3cgaXMgdGhlIHNhbWUgb25lIGV2ZXJ5IG90aGVyIHdiIGNvbW1hbmQgd291bGQgbG9hZC5cbiAgY29uc3QgcHJvZmlsZSA9IHByb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnO1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYCBtYWtlcyB1bnJlc29sdmFibGUgc2VjcmV0cyAoZS5nLiBhIG1pc3NpbmcgYWdlIGlkZW50aXR5KSBhIGhhcmQgZmFpbHVyZSxcbiAgLy8gdW5saWtlIHRoZSB0b2xlcmFudCBkZWZhdWx0IHVzZWQgZm9yIG9yZGluYXJ5IGVudiBsb2FkaW5nLlxuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBgZm5veCBleHBvcnQgLS1hbGwgLS1mb3JtYXQganNvbiAtLW5vLWRhZW1vbiAtLWlmLW1pc3NpbmcgZXJyb3IgLS1wcm9maWxlICR7cHJvZmlsZX0gPiAvZGV2L251bGxgLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlc29sdmUgZm5veC1kZWNsYXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHByb2ZpbGUgXCIke3Byb2ZpbGV9XCIuYCkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGBBbGwgZm5veC1kZWNsYXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVzb2x2ZSBmb3IgcHJvZmlsZSBcIiR7cHJvZmlsZX1cIi5gKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2kgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kLCBnZXREMURhdGFiYXNlTmFtZSwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHsgZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiB9IGZyb20gJy4vbGl0ZXN0cmVhbS5qcyc7XG5cbmNsYXNzIERyaXp6bGVTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2NsZWFudXAtbGl0ZXN0cmVhbScpO1xuICAgIGNvbnN0IHdhbENoZWNrcG9pbnRDb21tYW5kID0gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdICYmIGNvbW1hbmQgLXYgc3FsaXRlMyA+L2Rldi9udWxsOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgc3FsaXRlMyBcIiR7ZGJQYXRofVwiOyBmaWA7XG4gICAgcmV0dXJuIGAke3dhbENoZWNrcG9pbnRDb21tYW5kfTsgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKjsgcm0gLVJmIFwiJHtwYXRoLmRpcm5hbWUoZGJQYXRoKX0vLiR7cGF0aC5iYXNlbmFtZShkYlBhdGgpfVwiKiB8fCB0cnVlYDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IGQxRGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gICAgaWYgKGQxRGF0YWJhc2VOYW1lKSB7XG4gICAgICAvLyBSZW1vdmUgb25seSB0aGUgRDEgc3VidHJlZSBzbyB0aGF0IG90aGVyIGxvY2FsbHktcGVyc2lzdGVkIGJpbmRpbmdzIChLViwgUjIsIER1cmFibGUgT2JqZWN0cykgc3Vydml2ZSxcbiAgICAgIC8vIHRoZW4gcmUtbWF0ZXJpYWxpemUgdGhlIEQxIFNRTGl0ZSBmaWxlLiBJdHMgcGF0aCBpcyBkZXRlcm1pbmlzdGljLCBzbyBhIERBVEFCQVNFX1VSTCBleHBvcnRlZFxuICAgICAgLy8gYmVmb3JlIHRoZSByZW1vdmFsIHN0YXlzIHZhbGlkLlxuICAgICAgcmV0dXJuIGBybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX0vdjMvZDFcIiAmJiAke2J1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0LCBkMURhdGFiYXNlTmFtZSl9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbW92ZUNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoIXJlbW92ZUNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHJlc2V0IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlZWRDb21tYW5kID0gdGhpcy5zZWVkKHByb2plY3QpO1xuICAgIGNvbnN0IG1pZ3JhdGVDb21tYW5kID0gdGhpcy5kZXBsb3kocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIHJldHVybiBzZWVkQ29tbWFuZCA9PT0gJ3RydWUnID8gbWlncmF0ZUNvbW1hbmQgOiBgJHttaWdyYXRlQ29tbWFuZH0gJiYgJHtzZWVkQ29tbWFuZH1gO1xuICB9XG5cbiAgbWlncmF0ZUZvclN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpICYmIChidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KSB8fCBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gIH1cblxuICBkZXBsb3kocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYG1pZ3JhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnZGVwbG95LWZvcmNlJyk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBUaGUgZW52aXJvbm1lbnQgYXNzaWdubWVudCBtdXN0IGdvIHRocm91Z2ggYnVpbGREcml6emxlS2l0Q29tbWFuZDogcHJlZml4aW5nIGl0c1xuICAgIC8vIHBvc3NpYmx5LXBhcmVudGhlc2l6ZWQgcmVzdWx0IHdpdGggYEFMTE9XX1RPX1NLSVBfU0VFRD0wYCB3b3VsZCBiZSBhIHNoZWxsIHN5bnRheCBlcnJvci5cbiAgICBjb25zdCBtaWdyYXRlV2l0aFNlZWRDb21tYW5kID0gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCAnbWlncmF0ZScsICdBTExPV19UT19TS0lQX1NFRUQ9MCcpO1xuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyAke3RoaXMuZGVwbG95KHByb2plY3QpfSAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH1cIiAmJiBscyAtYWhsIFwiJHtkYlBhdGh9XCIgJiYgJHttaWdyYXRlV2l0aFNlZWRDb21tYW5kfWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnbGlzdC1iYWNrdXBzJyk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IFwiJHtkYlBhdGh9XCJgO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdyZXN0b3JlJyk7XG4gICAgcmV0dXJuIGAke2J1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChvdXRwdXRQYXRoKX07IGxpdGVzdHJlYW0gcmVzdG9yZSAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IC1vIFwiJHtvdXRwdXRQYXRofVwiIFwiJHtkYlBhdGh9XCJgO1xuICB9XG5cbiAgZ2VuZXJhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYGdlbmVyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG5cbiAgbWlncmF0ZURldihwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uc2VlZCkgcmV0dXJuICdZQVJOIHJ1biBzZWVkJztcbiAgICBjb25zdCBkZWZhdWx0U2VlZFBhdGggPSBwYXRoLmpvaW4oJ2RiJywgJ3NlZWQudHMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBkZWZhdWx0U2VlZFBhdGgpKSkge1xuICAgICAgcmV0dXJuIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYEJVTiAke2RlZmF1bHRTZWVkUGF0aH1gIDogYEJVTiBidWlsZC10cyBydW4gJHtkZWZhdWx0U2VlZFBhdGh9YDtcbiAgICB9XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiBzdHVkaW8gZm9yIERyaXp6bGUgZG9lcyBub3Qgc3VwcG9ydCBkYi11cmwtb3ItcGF0aC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJnczogc3RyaW5nLCBlbnZpcm9ubWVudEFzc2lnbm1lbnQgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmQgPSBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnQgJiYgYCR7ZW52aXJvbm1lbnRBc3NpZ25tZW50fSBgfVlBUk4gZHJpenpsZS1raXQgJHthcmdzfWA7XG4gIC8vIEEgY2FsbGVyLXN1cHBsaWVkIC0tY29uZmlnIHJlc29sdmVzIGFnYWluc3QgdGhlIHByb2plY3QgZGlyZWN0b3J5LCBzbyB0aGUgY3dkIG11c3Qgc3RheSB0aGVyZS5cbiAgcmV0dXJuIGFyZ3MuaW5jbHVkZXMoJy0tY29uZmlnJykgPyBjb21tYW5kIDogd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGNvbW1hbmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICAvLyBkcml6emxlLWtpdCByZXNvbHZlcyByZWxhdGl2ZSBwYXRocyBpbiBpdHMgY29uZmlnIGFnYWluc3QgdGhlIGN3ZCwgc28gdGhlIGNvbW1hbmQgbXVzdCBydW5cbiAgLy8gaW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGRyaXp6bGUuY29uZmlnLiogZXZlbiB3aGVuIG1vbm9yZXBvIHBhY2thZ2VzIHNoYXJlIGl0IGF0IHRoZSByb290LlxuICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy5kaXJQYXRoICE9PSBwcm9qZWN0LmRpclBhdGhcbiAgICA/IGAoJHtidWlsZFNoZWxsQ29tbWFuZChbJ2NkJywgY29uZmlnLmRpclBhdGhdKX0gJiYgJHtjb21tYW5kfSlgXG4gICAgOiBjb21tYW5kO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZHJpenpsZS1raXQgaXMgdGhlIHByb2plY3QncyBEMSBtaWdyYXRpb24gbWVjaGFuaXNtLiBBIGRyaXp6bGUtb3JtIGRlcGVuZGVuY3kgYWxvbmUgaXNcbiAqIG5vdCBhIHJlbGlhYmxlIG1hcmtlcjogYSBXb3JrZXIgbWF5IHVzZSBEMSBvbmx5IGZvciBjYWNoaW5nIHdoaWxlIGl0cyBkcml6emxlIGNvbmZpZyB0YXJnZXRzIGFuXG4gKiB1bnJlbGF0ZWQgZGF0YWJhc2UgKGUuZy4gUG9zdGdyZVNRTCB2aWEgSHlwZXJkcml2ZSksIGFuZCBydW5uaW5nIGBkcml6emxlLWtpdCBtaWdyYXRlYCBhZ2FpbnN0XG4gKiB0aGF0IGRhdGFiYXNlIGR1cmluZyBhIEQxIGRlcGxveSB3b3VsZCBiZSB3cm9uZyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS5cbiAqIFNvIHJlcXVpcmUgYW4gZXhwbGljaXQgbWFya2VyOiBhIGRyaXp6bGUgY29uZmlnIHdob3NlIGRpYWxlY3QvZHJpdmVyIHRhcmdldHMgc3FsaXRlLCBkMS1odHRwLCBvclxuICogZHVyYWJsZS1zcWxpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzRHJpenpsZUtpdEZvckQxKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBzdHJpcEpzQ29tbWVudHMoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgY29uZmlnLmZpbGVOYW1lKSwgJ3V0ZjgnKSk7XG4gICAgLy8gU2NhbiBvbmx5IHRoZSBleHBvcnRlZCBjb25maWcncyBvYmplY3QgbGl0ZXJhbDogZHJpenpsZS1raXQgY29uc3VtZXMgdGhlIGRlZmF1bHQgZXhwb3J0LFxuICAgIC8vIGFuZCBtYXRjaGluZyBvdGhlciB0ZXh0IChhbiB1bnVzZWQgc3FsaXRlLXNoYXBlZCBjb25zdGFudCBhYm92ZSB0aGUgZXhwb3J0LCBvciBtYXJrZXItbGlrZVxuICAgIC8vIHN0cmluZyBjb250ZW50IGluIHN0YXRlbWVudHMgYWZ0ZXIgaXQpIHdvdWxkIHNlbGVjdCB0aGUgd3JvbmcgbWlncmF0aW9uIG1lY2hhbmlzbS5cbiAgICAvLyBQT1NJVElPTlMgKGV4cG9ydCBtYXJrZXJzLCBkZWNsYXJhdGlvbnMpIGFyZSBsb2NhdGVkIG9uIGEgc3RyaW5nLW1hc2tlZCB2aWV3IG9mIHRoZSBzYW1lXG4gICAgLy8gbGVuZ3RoLCBzbyBgZXhwb3J0IGRlZmF1bHRgIGluc2lkZSBhIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBtaXNsZWFkIHRoZSBzZWFyY2guXG4gICAgY29uc3QgbWFza2VkQ29udGVudCA9IG1hc2tTdHJpbmdDb250ZW50cyhjb250ZW50KTtcbiAgICBjb25zdCBleHBvcnRJbmRpY2VzID0gWydleHBvcnQgZGVmYXVsdCcsICdtb2R1bGUuZXhwb3J0cyddXG4gICAgICAubWFwKChtYXJrZXIpID0+IG1hc2tlZENvbnRlbnQuaW5kZXhPZihtYXJrZXIpKVxuICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ICE9PSAtMSk7XG4gICAgY29uc3QgZXhwb3J0U3RhcnRJbmRleCA9IGV4cG9ydEluZGljZXMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLmV4cG9ydEluZGljZXMpIDogMDtcbiAgICBjb25zdCBvYmplY3RTcGFuID0gZXh0cmFjdEV4cG9ydGVkQ29uZmlnT2JqZWN0KGNvbnRlbnQsIG1hc2tlZENvbnRlbnQsIGV4cG9ydFN0YXJ0SW5kZXgpO1xuICAgIHJldHVybiBvYmplY3RTcGFuICE9PSB1bmRlZmluZWQgJiYgZGVjbGFyZXNTcWxpdGVUYXJnZXQob2JqZWN0U3Bhbik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvYmplY3QgbGl0ZXJhbCB0aGUgZXhwb3J0IGFjdHVhbGx5IGV2YWx1YXRlcyB0bzogZm9yIGBleHBvcnQgZGVmYXVsdCB7Li4ufWAgb3JcbiAqIGBleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoey4uLn0pYCB0aGUgZmlyc3QgYmFsYW5jZWQgb2JqZWN0IGFmdGVyIHRoZSBtYXJrZXIsIGFuZCBmb3JcbiAqIGBleHBvcnQgZGVmYXVsdCBjb25maWc7YCB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhhdCBpZGVudGlmaWVyJ3MgZGVjbGFyYXRpb24g4oCUIG5ldmVyIHRoZSB3aG9sZVxuICogZmlsZSwgc2luY2UgYW4gdW5yZWxhdGVkIG9iamVjdCAoZS5nLiBhbiB1bnVzZWQgc3FsaXRlLXNoYXBlZCBjb25zdGFudCkgbXVzdCBub3QgYmUgc2VsZWN0ZWQuXG4gKiBVbmRlZmluZWQgd2hlbiB0aGUgZXhwcmVzc2lvbiBjYW5ub3QgYmUgcmVzb2x2ZWQ7IHdiIGRlcGxveSdzIHVubWFuYWdlZC1EMSB3YXJuaW5nIGNvdmVycyB0aGF0LlxuICovXG5mdW5jdGlvbiBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgbWFza2VkQ29udGVudDogc3RyaW5nLFxuICBleHBvcnRTdGFydEluZGV4OiBudW1iZXJcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4cG9ydGVkRXhwcmVzc2lvbiA9IG1hc2tlZENvbnRlbnRcbiAgICAuc2xpY2UoZXhwb3J0U3RhcnRJbmRleClcbiAgICAucmVwbGFjZSgvXig/OmV4cG9ydFxccytkZWZhdWx0fG1vZHVsZVxcLmV4cG9ydHNcXHMqPSlcXHMqLywgJycpO1xuICAvLyBBbiBpZGVudGlmaWVyIGV4cG9ydCBtYXkgY2FycnkgYSBUeXBlU2NyaXB0IHR5cGUgcG9zdGZpeCAoYGNvbmZpZyBzYXRpc2ZpZXMgQ29uZmlnO2AgL1xuICAvLyBgY29uZmlnIGFzIENvbmZpZztgKTsgdGhlIGlkZW50aWZpZXIgaXMgcmVjb2duaXplZCBGSVJTVCBzbyBhIHBvc3RmaXggY29udGFpbmluZyBhIFRZUEVcbiAgLy8gbGl0ZXJhbCAoYHNhdGlzZmllcyB7IGRpYWxlY3Q6ICdzcWxpdGUnIHwgLi4uIH1gKSBpcyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlIHJ1bnRpbWUgY29uZmlnLlxuICBjb25zdCBpZGVudGlmaWVyTWF0Y2ggPSAvXihbQS1aYS16XyRdW1xcdyRdKilcXHMqKD86c2F0aXNmaWVzXFxifGFzXFxifDt8XFxufCQpLy5leGVjKGV4cG9ydGVkRXhwcmVzc2lvbik7XG4gIGlmICghaWRlbnRpZmllck1hdGNoKSB7XG4gICAgY29uc3QgYnJhY2VPZmZzZXQgPSBtYXNrZWRDb250ZW50LnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXgpLmluZGV4T2YoJ3snKTtcbiAgICBpZiAoYnJhY2VPZmZzZXQgPT09IC0xKSByZXR1cm47XG4gICAgcmV0dXJuIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCArIGJyYWNlT2Zmc2V0KSk7XG4gIH1cblxuICAvLyBgJGAgaXMgbGVnYWwgaW4gaWRlbnRpZmllcnMgYnV0IGEgcmVnZXggYW5jaG9yLCBzbyBpdCBtdXN0IGJlIGVzY2FwZWQgYmVmb3JlIGludGVycG9sYXRpb247XG4gIC8vIGAoPyFbXFx3JF0pYCAobm90IGBcXGJgKSBlbmRzIHRoZSBtYXRjaCBiZWNhdXNlIGBcXGJgIG5ldmVyIGZpcmVzIGFmdGVyIGEgdHJhaWxpbmcgYCRgLlxuICBjb25zdCBlc2NhcGVkSWRlbnRpZmllciA9IGlkZW50aWZpZXJNYXRjaFsxXSEucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uRW5kSW5kZXggPSBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50LCBlc2NhcGVkSWRlbnRpZmllcik7XG4gIGlmIChkZWNsYXJhdGlvbkVuZEluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgLy8gVGhlIGluaXRpYWxpemVyIG11c3QgYmVsb25nIHRvIFRISVMgZGVjbGFyYXRpb24gKGEgdHlwZSBhbm5vdGF0aW9uIG1heSBwcmVjZWRlIHRoZSBgPWApOyBhblxuICAvLyB1bmluaXRpYWxpemVkIGBsZXQgY29uZmlnO2Agc3RheXMgdW5yZXNvbHZlZCBpbnN0ZWFkIG9mIGdyYWJiaW5nIGEgbGF0ZXIgc3RhdGVtZW50J3MgYD1gLlxuICBjb25zdCBhc3NpZ25tZW50TWF0Y2ggPSAvXlxccyooPzo6W149O1xcbl0qKT89Ly5leGVjKG1hc2tlZENvbnRlbnQuc2xpY2UoZGVjbGFyYXRpb25FbmRJbmRleCkpO1xuICBpZiAoIWFzc2lnbm1lbnRNYXRjaCkgcmV0dXJuO1xuICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4ICsgYXNzaWdubWVudE1hdGNoWzBdLmxlbmd0aCkpO1xufVxuXG4vKipcbiAqIFRoZSBlbmQgaW5kZXggb2YgdGhlIGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiBhdCBicmFjZSBkZXB0aCBaRVJPIChtb2R1bGUgc2NvcGUpOiBhIHNhbWUtbmFtZWRcbiAqIGRlY2xhcmF0aW9uIGluc2lkZSBhIGZ1bmN0aW9uIGJvZHkgbXVzdCBub3Qgc2hhZG93IHRoZSBiaW5kaW5nIHRoZSBleHBvcnQgcmVmZXJlbmNlcywgYW5kXG4gKiBpbmRlbnRhdGlvbiBpcyBubyBzY29wZSBzaWduYWwg4oCUIGRlcHRoIG92ZXIgdGhlIHN0cmluZy1tYXNrZWQgY29udGVudCBpcy5cbiAqL1xuZnVuY3Rpb24gZmluZE1vZHVsZVNjb3BlRGVjbGFyYXRpb25FbmQobWFza2VkQ29udGVudDogc3RyaW5nLCBlc2NhcGVkSWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjbGFyYXRpb25SZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgU3RyaW5nLnJhd2AoPzwhW1xcdyRdKSg/OmV4cG9ydFxccyspPyg/OmNvbnN0fGxldHx2YXIpXFxzKyR7ZXNjYXBlZElkZW50aWZpZXJ9KD8hW1xcdyRdKWAsXG4gICAgJ2cnXG4gICk7XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBzY2FuSW5kZXggPSAwO1xuICBmb3IgKGxldCBtYXRjaCA9IGRlY2xhcmF0aW9uUmVnZXguZXhlYyhtYXNrZWRDb250ZW50KTsgbWF0Y2g7IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpKSB7XG4gICAgZm9yICg7IHNjYW5JbmRleCA8IG1hdGNoLmluZGV4OyBzY2FuSW5kZXgrKykge1xuICAgICAgY29uc3QgY2hhciA9IG1hc2tlZENvbnRlbnRbc2NhbkluZGV4XTtcbiAgICAgIGlmIChjaGFyID09PSAneycpIGRlcHRoKys7XG4gICAgICBlbHNlIGlmIChjaGFyID09PSAnfScpIGRlcHRoLS07XG4gICAgfVxuICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIHRoZSBDT05URU5UUyBvZiBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBzcGFjZXMgKHNhbWUgbGVuZ3RoLCBuZXdsaW5lcyBrZXB0KSwgc28gcG9zaXRpb25cbiAqIHNlYXJjaGVzIG92ZXIgdGhlIHJlc3VsdCBjYW5ub3QgbWF0Y2ggdGV4dCBpbnNpZGUgc3RyaW5ncyB3aGlsZSBhbGwgaW5kZXhlcyBzdGlsbCBtYXAgMToxIHRvXG4gKiB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgICc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSB7XG4gICAgICAgIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGNoYXIgPT09ICdcXG4nID8gJ1xcbicgOiAnICc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIHJlc3VsdCArPSBjaGFyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU3RyaW5nLWF3YXJlIHNjYW4gZm9yIHRoZSBtYXJrZXJzIGluZGljYXRpbmcgdGhlIGNvbmZpZyBtYW5hZ2VzIGEgKENsb3VkZmxhcmUgRDEgY29tcGF0aWJsZSlcbiAqIFNRTGl0ZSBkYXRhYmFzZSDigJQgYSBgZGlhbGVjdDogJ3NxbGl0ZSdgLCBgZHJpdmVyOiAnZDEtaHR0cCdgLCBvciBgZHJpdmVyOiAnZHVyYWJsZS1zcWxpdGUnYFxuICogUFJPUEVSVFkgKHBsYWluIG9yIHF1b3RlZCBrZXkpLiBLZXlzIGFyZSBvbmx5IHJlY29nbml6ZWQgaW4gY29kZSBwb3NpdGlvbiwgc28gbWFya2VyLWxpa2UgdGV4dFxuICogZW1iZWRkZWQgaW4gdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBzY2hlbWEgcGF0aCkgY2Fubm90IG1hdGNoLlxuICovXG5mdW5jdGlvbiBkZWNsYXJlc1NxbGl0ZVRhcmdldChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmdzKGNvbnRlbnQpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSE7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB2YWx1ZVRva2VuSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2NvZGUnKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IC8oPzpefFtcXHN7LChdKShkaWFsZWN0fGRyaXZlcilcXHMqOlxccyokLy5leGVjKHRva2VuLnZhbHVlKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBrZXkgPSBtYXRjaFsxXTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICdkaWFsZWN0JyB8fCB0b2tlbi52YWx1ZSA9PT0gJ2RyaXZlcicpIHtcbiAgICAgIC8vIEEgcXVvdGVkIGtleTogdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG9rZW5zIG11c3QgZm9ybSBhIHByb3BlcnR5IHBvc2l0aW9uIChge2AvYCxgIGJlZm9yZSxcbiAgICAgIC8vIGA6YCBhZnRlcikuXG4gICAgICBjb25zdCBwcmV2aW91c1Rva2VuID0gdG9rZW5zW2luZGV4IC0gMV07XG4gICAgICBjb25zdCBuZXh0VG9rZW4gPSB0b2tlbnNbaW5kZXggKyAxXTtcbiAgICAgIGlmIChcbiAgICAgICAgcHJldmlvdXNUb2tlbj8udHlwZSA9PT0gJ2NvZGUnICYmXG4gICAgICAgIC9beywoXVxccyokLy50ZXN0KHByZXZpb3VzVG9rZW4udmFsdWUpICYmXG4gICAgICAgIG5leHRUb2tlbj8udHlwZSA9PT0gJ2NvZGUnICYmXG4gICAgICAgIC9eXFxzKjpcXHMqJC8udGVzdChuZXh0VG9rZW4udmFsdWUpXG4gICAgICApIHtcbiAgICAgICAga2V5ID0gdG9rZW4udmFsdWU7XG4gICAgICAgIHZhbHVlVG9rZW5JbmRleCA9IGluZGV4ICsgMjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlVG9rZW5JbmRleCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHZhbHVlVG9rZW4gPSB0b2tlbnNbdmFsdWVUb2tlbkluZGV4XTtcbiAgICBpZiAodmFsdWVUb2tlbj8udHlwZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT09ICdkaWFsZWN0JyAmJiB2YWx1ZVRva2VuLnZhbHVlID09PSAnc3FsaXRlJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGtleSA9PT0gJ2RyaXZlcicgJiYgKHZhbHVlVG9rZW4udmFsdWUgPT09ICdkMS1odHRwJyB8fCB2YWx1ZVRva2VuLnZhbHVlID09PSAnZHVyYWJsZS1zcWxpdGUnKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0IGludG8gYWx0ZXJuYXRpbmcgY29kZSBhbmQgc3RyaW5nLWxpdGVyYWwtY29udGVudCB0b2tlbnMgKHF1b3RlcyBleGNsdWRlZCkuIFRoZSBpbnB1dCBpc1xuICogYWxyZWFkeSBjb21tZW50LWZyZWUg4oCUIHVzZXNEcml6emxlS2l0Rm9yRDEgcnVucyBzdHJpcEpzQ29tbWVudHMgYmVmb3JlIGFueSBzY2FubmluZyDigJQgc29cbiAqIGNvbW1lbnQgZGVsaW1pdGVycyBuZWVkIG5vIGhhbmRsaW5nIGhlcmUgKGEgY29tbWVudGVkLW91dCBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGNhbiBuZXZlclxuICogcmVhY2ggdGhpcyB0b2tlbml6ZXIpLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZVN0cmluZ3MoY29udGVudDogc3RyaW5nKTogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICBjb25zdCB0b2tlbnM6IHsgdHlwZTogJ2NvZGUnIHwgJ3N0cmluZyc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gIGxldCBjb2RlID0gJyc7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gICAgICBjb2RlID0gJyc7XG4gICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgIGluZGV4Kys7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2luZGV4XSAhPT0gY2hhcikge1xuICAgICAgICBpZiAoY29udGVudFtpbmRleF0gPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgICAgdmFsdWUgKz0gY29udGVudFtpbmRleF0gPz8gJyc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICdzdHJpbmcnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2RlICs9IGNoYXI7XG4gIH1cbiAgdG9rZW5zLnB1c2goeyB0eXBlOiAnY29kZScsIHZhbHVlOiBjb2RlIH0pO1xuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKiogVGhlIGZpcnN0IGB7IC4uLiB9YCBzcGFuIChzdHJpbmctYXdhcmUgYnJhY2UgbWF0Y2hpbmcpLCBvciB1bmRlZmluZWQgd2hlbiBub25lIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0YXJ0SW5kZXggPSBjb250ZW50LmluZGV4T2YoJ3snKTtcbiAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICBlbHNlIGlmIChjaGFyID09PSAneycpIGRlcHRoKys7XG4gICAgZWxzZSBpZiAoY2hhciA9PT0gJ30nICYmIC0tZGVwdGggPT09IDApIHJldHVybiBjb250ZW50LnNsaWNlKHN0YXJ0SW5kZXgsIGluZGV4ICsgMSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlbW92ZSBibG9jayBhbmQgbGluZSBjb21tZW50cyBzbyBjb21tZW50ZWQtb3V0IG1hcmtlcnMgKGUuZy4gYC8vIGRpYWxlY3Q6ICdzcWxpdGUnYCBpbiBhXG4gKiBQb3N0Z3JlU1FMIGNvbmZpZykgY2Fubm90IG1pc2NsYXNzaWZ5IHRoZSBjb25maWcuIFRoZSBzY2FubmVyIHRyYWNrcyBzdHJpbmcgc3RhdGUsIHNvIGAvL2BcbiAqIGluc2lkZSBzdHJpbmcgbGl0ZXJhbHMgKFVSTHMgc3VjaCBhcyBgaHR0cHM6Ly8uLi5gIGluIGNvbm5lY3Rpb24gc3RyaW5ncykgc3Vydml2ZXMgd2hpbGVcbiAqIGNvbW1lbnRzIGRpcmVjdGx5IGFmdGVyIGEgc3RyaW5nIGxpdGVyYWwgYXJlIHN0aWxsIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwSnNDb21tZW50cyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBjb25zdCBuZXh0Q2hhciA9IGNvbnRlbnRbaW5kZXggKyAxXTtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyICsgKG5leHRDaGFyID8/ICcnKTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0Q2hhciA9PT0gJy8nKSB7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2luZGV4XSAhPT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICByZXN1bHQgKz0gJ1xcbic7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0Q2hhciA9PT0gJyonKSB7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgIShjb250ZW50W2luZGV4XSA9PT0gJyonICYmIGNvbnRlbnRbaW5kZXggKyAxXSA9PT0gJy8nKSkgaW5kZXgrKztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmREcml6emxlQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB7IGRpclBhdGg6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFsnZHJpenpsZS5jb25maWcudHMnLCAnZHJpenpsZS5jb25maWcubXRzJywgJ2RyaXp6bGUuY29uZmlnLmpzJywgJ2RyaXp6bGUuY29uZmlnLm1qcyddO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgW3Byb2plY3QuZGlyUGF0aCwgcHJvamVjdC5yb290RGlyUGF0aF0pIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGNhbmRpZGF0ZXMuZmluZCgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpO1xuICAgIGlmIChmaWxlTmFtZSkgcmV0dXJuIHsgZGlyUGF0aCwgZmlsZU5hbWUgfTtcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xuICByZXR1cm4gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGFic29sdXRlUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLWYgXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofS13YWxcIiBcIiR7ZGJQYXRofS1zaG1cImA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGhPckVycm9yKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3YiBkYiAke2NvbW1hbmROYW1lfSBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LmApO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGhPckVycm9yKHByb2plY3QsIGNvbW1hbmROYW1lKTtcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xufVxuXG5leHBvcnQgY29uc3QgZHJpenpsZVNjcmlwdHMgPSBuZXcgRHJpenpsZVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi93cmFuZ2xlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JhbmdsZXJEMURhdGFiYXNlIHtcbiAgYmluZGluZz86IHN0cmluZztcbiAgZGF0YWJhc2VfbmFtZT86IHN0cmluZztcbiAgZGF0YWJhc2VfaWQ/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfZGlyPzogc3RyaW5nO1xuICBtaWdyYXRpb25zX3BhdHRlcm4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgRDEgYmluZGluZyB1c2VzIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHRoYXQgYHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHlgXG4gKiB3b3VsZCBhY3R1YWxseSBkaXNjb3ZlcjogYW4gZXhwbGljaXQgYG1pZ3JhdGlvbnNfcGF0dGVybmAgb3B0cyBpbiwgb3RoZXJ3aXNlIHRoZSBtaWdyYXRpb25zXG4gKiBkaXJlY3RvcnkgbXVzdCBjb250YWluIGZsYXQgYCouc3FsYCBmaWxlcyAod3JhbmdsZXIncyBkZWZhdWx0IHBhdHRlcm4pLiBBIGRyaXp6bGUta2l0IGBvdXRgXG4gKiBkaXJlY3Rvcnkgd2l0aCBuZXN0ZWQgYDxuYW1lPi9taWdyYXRpb24uc3FsYCBmaWxlcyBhbmQgbm8gcGF0dGVybiB3b3VsZCBtYXRjaCBub3RoaW5nIGFuZFxuICogc2lsZW50bHkgYXBwbHkgemVybyBtaWdyYXRpb25zLCBzbyBpdCBtdXN0IGZhbGwgdGhyb3VnaCB0byB0aGUgZHJpenpsZS1raXQgbWVjaGFuaXNtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyhwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGRhdGFiYXNlOiBXcmFuZ2xlckQxRGF0YWJhc2UpOiBib29sZWFuIHtcbiAgLy8gQW4gZXhwbGljaXQgcGF0dGVybiBvcHRzIGludG8gdGhlIHdyYW5nbGVyLW5hdGl2ZSBtZWNoYW5pc20gZXZlbiBiZWZvcmUgdGhlIGRpcmVjdG9yeVxuICAvLyBleGlzdHM7IHdyYW5nbGVyIHRoZW4gZmFpbHMgc2FmZWx5IHdpdGggXCJObyBtaWdyYXRpb25zIGZvbGRlciBmb3VuZFwiIGluc3RlYWQgb2Ygd2JcbiAgLy8gc2lsZW50bHkgc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IG1pZ3JhdGlvbiBlbmdpbmUuXG4gIGlmIChkYXRhYmFzZS5taWdyYXRpb25zX3BhdHRlcm4pIHJldHVybiB0cnVlO1xuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRhdGFiYXNlLm1pZ3JhdGlvbnNfZGlyID8/ICdtaWdyYXRpb25zJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtaWdyYXRpb25zRGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKS5zb21lKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuZW5kc1dpdGgoJy5zcWwnKSk7XG59XG5cbmNvbnN0IE5BTUVfS0VZRURfQklORElOR19QQVJFTlRTID0gbmV3IFNldChbJ2JpbmRpbmdzJywgJ3NlbmRfZW1haWwnLCAncmF0ZWxpbWl0cyddKTtcbmNvbnN0IFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMgPSBuZXcgU2V0KFsnd2FzbV9tb2R1bGVzJywgJ3RleHRfYmxvYnMnLCAnZGF0YV9ibG9icyddKTtcblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IGJpbmRpbmcgbmFtZSBkZWNsYXJlZCBpbiB0aGUgKGVudmlyb25tZW50LXJlc29sdmVkKSBjb25maWcgc3VidHJlZTogYGJpbmRpbmdgXG4gKiBwcm9wZXJ0aWVzIGFueXdoZXJlIChEMSwgS1YsIFIyLCBzZXJ2aWNlcywgYXNzZXRzLCBxdWV1ZXMsIGV0Yy4pLCB0aGUgYG5hbWVgLWtleWVkIGJpbmRpbmdzXG4gKiAoYGR1cmFibGVfb2JqZWN0cy5iaW5kaW5nc2AsIGBsb2dmd2RyLmJpbmRpbmdzYCwgYHNlbmRfZW1haWxgLCBgcmF0ZWxpbWl0c2ApLCBhbmQgdGhlXG4gKiByZWNvcmQta2V5ZWQgbGVnYWN5IG1vZHVsZSBiaW5kaW5ncyAoYHdhc21fbW9kdWxlc2AsIGB0ZXh0X2Jsb2JzYCwgYGRhdGFfYmxvYnNgKS4gQSBzZWNyZXRcbiAqIHNoYXJpbmcgYSBiaW5kaW5nJ3MgbmFtZSB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoYXQgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nIG9uIGRlcGxveS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCaW5kaW5nTmFtZXModmFsdWU6IHVua25vd24sIG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCksIHBhcmVudEtleSA9ICcnKTogU2V0PHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIGNvbGxlY3RCaW5kaW5nTmFtZXMoaXRlbSwgbmFtZXMsIHBhcmVudEtleSk7XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG5hbWVzO1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICBpZiAoa2V5ID09PSAnYmluZGluZycgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25hbWUnICYmIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgJiYgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMuaGFzKHBhcmVudEtleSkpIHtcbiAgICAgIG5hbWVzLmFkZChjaGlsZCk7XG4gICAgfSBlbHNlIGlmIChSRUNPUkRfS0VZRURfQklORElOR19LRVlTLmhhcyhrZXkpICYmIGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmdOYW1lIG9mIE9iamVjdC5rZXlzKGNoaWxkKSkgbmFtZXMuYWRkKGJpbmRpbmdOYW1lKTtcbiAgICB9IGVsc2UgaWYgKGtleSAhPT0gJ2VudicgJiYga2V5ICE9PSAndmFycycgJiYga2V5ICE9PSAnbWV0YWRhdGEnICYmIGtleSAhPT0gJ29wdGlvbnMnKSB7XG4gICAgICAvLyBOZXN0ZWQgYGVudmAgc3VidHJlZXMgYmVsb25nIHRvIG90aGVyIGVudmlyb25tZW50czsgYHZhcnNgIHZhbHVlcywgYHVuc2FmZS5tZXRhZGF0YWAsXG4gICAgICAvLyBhbmQgYHVuc2FmZS5iaW5kaW5nc1tdLmRldi5vcHRpb25zYCBhcmUgYXJiaXRyYXJ5IEpTT04gd2hvc2UgcHJvcGVydGllcyAoZS5nLiBhXG4gICAgICAvLyBcImJpbmRpbmdcIiBmaWVsZCkgYXJlIGRhdGEsIG5vdCBXb3JrZXIgYmluZGluZ3MuXG4gICAgICBjb2xsZWN0QmluZGluZ05hbWVzKGNoaWxkLCBuYW1lcywga2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkV3JhbmdsZXJDb25maWcge1xuICAvKiogVGhlIFdvcmtlciBuYW1lIGZvciB0aGUgZGVwbG95IGVudmlyb25tZW50ICh3cmFuZ2xlciBhcHBlbmRzIGAtPGVudj5gIHdoZW4gdGhlIGVudiBzZWN0aW9uIGhhcyBubyBvd24gbmFtZSkuICovXG4gIHdvcmtlck5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRJZD86IHN0cmluZztcbiAgdmFyS2V5czogc3RyaW5nW107XG4gIC8qKiBUaGUgZW52aXJvbm1lbnQncyBgdmFyc2AgdmFsdWVzIChuZWVkZWQgZm9yIENsb3VkZmxhcmUncyBjb21iaW5lZCBjb3VudC9zaXplIGxpbWl0cykuICovXG4gIHZhcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU2VjcmV0cyBkZWNsYXJlZCBhcyByZXF1aXJlZCB2aWEgd3JhbmdsZXIncyBgc2VjcmV0cy5yZXF1aXJlZGAgKHZhbGlkYXRlZCBhdCBkZXBsb3kgdGltZSkuICovXG4gIHJlcXVpcmVkU2VjcmV0TmFtZXM6IHN0cmluZ1tdO1xuICAvKiogTmFtZXMgb2YgYWxsIG5vbi12YXIgYmluZGluZ3MgKEQxLCBLViwgUjIsIER1cmFibGUgT2JqZWN0cywgc2VuZF9lbWFpbCwgc2VydmljZXMsIC4uLikuICovXG4gIGJpbmRpbmdOYW1lczogc3RyaW5nW107XG4gIGQxRGF0YWJhc2VzOiBXcmFuZ2xlckQxRGF0YWJhc2VbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudmlyb25tZW50IGNvbWVzIGZyb20gYW4gYGVudi48bmFtZT5gIHNlY3Rpb24gKHRoZW4gd3JhbmdsZXIgY29tbWFuZHMgbmVlZFxuICAgKiBgLS1lbnYgPG5hbWU+YCAvIGBDTE9VREZMQVJFX0VOVj08bmFtZT5gKS4gYHByb2R1Y3Rpb25gIG1heSBiZSBlaXRoZXIgdGhlIHRvcCBsZXZlbCBvciBhXG4gICAqIG5hbWVkIGBlbnYucHJvZHVjdGlvbmAgc2VjdGlvbjsgdGhlIHNlY3Rpb24gd2lucyB3aGVuIGl0IGV4aXN0cy5cbiAgICovXG4gIHVzZXNFbnZTZWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmF3V3JhbmdsZXJDb25maWcge1xuICBuYW1lPzogc3RyaW5nO1xuICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICB2YXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGQxX2RhdGFiYXNlcz86IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICBhc3NldHM/OiB1bmtub3duO1xuICBsb2dmd2RyPzogdW5rbm93bjtcbiAgd2FzbV9tb2R1bGVzPzogdW5rbm93bjtcbiAgdGV4dF9ibG9icz86IHVua25vd247XG4gIGRhdGFfYmxvYnM/OiB1bmtub3duO1xuICBzaXRlPzogdW5rbm93bjtcbiAgc2VjcmV0cz86IHsgcmVxdWlyZWQ/OiBzdHJpbmdbXSB9O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBSYXdXcmFuZ2xlckNvbmZpZz47XG59XG5cbi8vIFdvcmtlcnMgU2l0ZXMgaW1wbGljaXRseSBiaW5kcyBpdHMgS1YgbmFtZXNwYWNlIGFzIF9fU1RBVElDX0NPTlRFTlQuXG5mdW5jdGlvbiBzaXRlQmluZGluZ05hbWVzKGNvbmZpZzogUmF3V3JhbmdsZXJDb25maWcsIGVudkNvbmZpZz86IFJhd1dyYW5nbGVyQ29uZmlnKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGVudkNvbmZpZz8uc2l0ZSA/PyBjb25maWcuc2l0ZSkgPyBbJ19fU1RBVElDX0NPTlRFTlQnXSA6IFtdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHdyYW5nbGVyIGNvbmZpZyB2YWx1ZXMgbmVlZGVkIGZvciBkZXBsb3lpbmcgdG8gdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogRm9sbG93cyB3cmFuZ2xlcidzIGluaGVyaXRhbmNlIHJ1bGVzOiBgYWNjb3VudF9pZGAgaXMgaW5oZXJpdGVkIGJ5IG5hbWVkIGVudmlyb25tZW50cyxcbiAqIHdoaWxlIGB2YXJzYCBhbmQgYGQxX2RhdGFiYXNlc2AgYXJlIG5vdCBhbmQgbXVzdCBiZSByZWRlY2xhcmVkIHBlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LFxuICBlbnZOYW1lOiBzdHJpbmdcbik6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG4gIGlmIChwYXRoLmV4dG5hbWUoY29uZmlnUGF0aCkgPT09ICcudG9tbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3diIGRlcGxveSBzdXBwb3J0cyB3cmFuZ2xlci5qc29uYy93cmFuZ2xlci5qc29uIGNvbmZpZ3Mgb25seTsgbWlncmF0ZSB3cmFuZ2xlci50b21sIGZpcnN0LicpO1xuICB9XG5cbiAgLy8ganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCB3b3VsZCByZXR1cm4gYSBwYXJ0aWFsIG9iamVjdCBmb3IgbWFsZm9ybWVkIGlucHV0LFxuICAvLyB3aGljaCBjb3VsZCBtaWdyYXRlIGEgcmVtb3RlIGRhdGFiYXNlIGZyb20gYSBoYWxmLXJlYWQgY29uZmlnOyByZWplY3QgYW55IHBhcnNlIGVycm9yLlxuICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gIGNvbnN0IGNvbmZpZyA9IHBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLCBwYXJzZUVycm9ycywge1xuICAgIGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSxcbiAgfSkgYXMgUmF3V3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gIGlmIChwYXJzZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtjb25maWdQYXRofTogJHtwYXJzZUVycm9ycy5sZW5ndGh9IEpTT05DIHN5bnRheCBlcnJvcihzKS5gKTtcbiAgfVxuICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gIGNvbnN0IGVudkNvbmZpZyA9IGNvbmZpZy5lbnY/LltlbnZOYW1lXTtcbiAgaWYgKCFlbnZDb25maWcgJiYgZW52TmFtZSAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgd3JhbmdsZXIgY29uZmlnIGhhcyBubyBcImVudlwiOiB7IFwiJHtlbnZOYW1lfVwiOiAuLi4gfSBzZWN0aW9uLmApO1xuICB9XG4gIHJldHVybiBlbnZDb25maWdcbiAgICA/IHtcbiAgICAgICAgd29ya2VyTmFtZTogZW52Q29uZmlnLm5hbWUgPz8gKGNvbmZpZy5uYW1lID8gYCR7Y29uZmlnLm5hbWV9LSR7ZW52TmFtZX1gIDogdW5kZWZpbmVkKSxcbiAgICAgICAgYWNjb3VudElkOiBlbnZDb25maWcuYWNjb3VudF9pZCA/PyBjb25maWcuYWNjb3VudF9pZCxcbiAgICAgICAgdmFyS2V5czogT2JqZWN0LmtleXMoZW52Q29uZmlnLnZhcnMgPz8ge30pLFxuICAgICAgICB2YXJzOiBlbnZDb25maWcudmFycyA/PyB7fSxcbiAgICAgICAgLy8gTW9zdCBiaW5kaW5ncyBhcmUgbm9uLWluaGVyaXRhYmxlIGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LCBzbyBvbmx5IHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCdzIG93biBuYW1lcyBjb3VudCDigJQgcGx1cyB0aGUgZ2VudWluZWx5IGluaGVyaXRlZCBzaGFwZXMgKGFzc2V0cywgbG9nZndkciksXG4gICAgICAgIC8vIHdoaWNoIHdyYW5nbGVyIHJlc29sdmVzIGFzIHdob2xlIGZpZWxkczogdGhlIGVudmlyb25tZW50J3Mgb3duIGZpZWxkIG92ZXJyaWRlcyB0aGVcbiAgICAgICAgLy8gdG9wIGxldmVsIGVudGlyZWx5LCBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUncyBuYW1lcyBjb3VudC5cbiAgICAgICAgYmluZGluZ05hbWVzOiBbXG4gICAgICAgICAgLi4uY29sbGVjdEJpbmRpbmdOYW1lcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXNzZXRzOiBlbnZDb25maWcuYXNzZXRzID8/IGNvbmZpZy5hc3NldHMsXG4gICAgICAgICAgICAgIGxvZ2Z3ZHI6IGVudkNvbmZpZy5sb2dmd2RyID8/IGNvbmZpZy5sb2dmd2RyLFxuICAgICAgICAgICAgICB3YXNtX21vZHVsZXM6IGVudkNvbmZpZy53YXNtX21vZHVsZXMgPz8gY29uZmlnLndhc21fbW9kdWxlcyxcbiAgICAgICAgICAgICAgdGV4dF9ibG9iczogZW52Q29uZmlnLnRleHRfYmxvYnMgPz8gY29uZmlnLnRleHRfYmxvYnMsXG4gICAgICAgICAgICAgIGRhdGFfYmxvYnM6IGVudkNvbmZpZy5kYXRhX2Jsb2JzID8/IGNvbmZpZy5kYXRhX2Jsb2JzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoZW52Q29uZmlnKVxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcsIGVudkNvbmZpZyksXG4gICAgICAgIF0sXG4gICAgICAgIGQxRGF0YWJhc2VzOiBlbnZDb25maWcuZDFfZGF0YWJhc2VzID8/IFtdLFxuICAgICAgICAvLyBgc2VjcmV0c2AgaXMgbm9uLWluaGVyaXRhYmxlOiBhIHRvcC1sZXZlbCByZXF1aXJlbWVudCBtdXN0IG5vdCBmb3JjZSAob3IgdXBsb2FkKVxuICAgICAgICAvLyBhIHNlY3JldCBpbnRvIGEgbmFtZWQgZW52aXJvbm1lbnQuXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGVudkNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IHRydWUsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHdvcmtlck5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICBhY2NvdW50SWQ6IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhjb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICBiaW5kaW5nTmFtZXM6IFsuLi5jb2xsZWN0QmluZGluZ05hbWVzKGNvbmZpZyksIC4uLnNpdGVCaW5kaW5nTmFtZXMoY29uZmlnKV0sXG4gICAgICAgIGQxRGF0YWJhc2VzOiBjb25maWcuZDFfZGF0YWJhc2VzID8/IFtdLFxuICAgICAgICByZXF1aXJlZFNlY3JldE5hbWVzOiBjb25maWcuc2VjcmV0cz8ucmVxdWlyZWQgPz8gW10sXG4gICAgICAgIHVzZXNFbnZTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH07XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgdXNlc0RyaXp6bGVLaXRGb3JEMSB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50LCBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZywgV3JhbmdsZXJEMURhdGFiYXNlIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52LCB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuXG4vKipcbiAqIEtleXMgdGhhdCBkcml2ZSB0aGUgZGVwbG95IGl0c2VsZiAob3IgYXJlIG1lYW5pbmdmdWwgb25seSBsb2NhbGx5KSBhbmQgdGh1cyBtdXN0IG5ldmVyIGJlXG4gKiBwdXNoZWQgdG8gdGhlIFdvcmtlciBhcyBzZWNyZXRzLiBgV0JfRU5WYCAvIGBORVhUX1BVQkxJQ19XQl9FTlZgIGJlbG9uZyBpbiB3cmFuZ2xlciBgdmFyc2AuXG4gKi9cbmNvbnN0IE5PTl9TRUNSRVRfS0VZUyA9IG5ldyBTZXQoW1xuICAnQ0knLFxuICAvLyBXcmFuZ2xlciBzeXN0ZW0vYXV0aGVudGljYXRpb24gdmFyaWFibGVzIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy93cmFuZ2xlci9zeXN0ZW0tZW52aXJvbm1lbnQtdmFyaWFibGVzLyksXG4gIC8vIGluY2x1ZGluZyBsZWdhY3kgYWxpYXNlczsgYXBwLXNwZWNpZmljIG5hbWVzIHN1Y2ggYXMgQ0xPVURGTEFSRV9SMl9BQ0NFU1NfS0VZX0lEIHN0YXkgZWxpZ2libGUuXG4gICdDRl9BQ0NPVU5UX0lEJyxcbiAgJ0NGX0FQSV9CQVNFX1VSTCcsXG4gICdDRl9BUElfRU1BSUwnLFxuICAnQ0ZfQVBJX0tFWScsXG4gICdDRl9BUElfVE9LRU4nLFxuICAnQ0ZfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9TRUNSRVQnLFxuICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0JBU0VfVVJMJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0tFWScsXG4gICdDTE9VREZMQVJFX0FQSV9UT0tFTicsXG4gICdDTE9VREZMQVJFX0FVVEhfVVNFX0tFWVJJTkcnLFxuICAnQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCcsXG4gICdDTE9VREZMQVJFX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfRU5WJyxcbiAgJ0NMT1VERkxBUkVfSU5DTFVERV9QUk9DRVNTX0VOVicsXG4gICdDTE9VREZMQVJFX0xPQURfREVWX1ZBUlNfRlJPTV9ET1RfRU5WJyxcbiAgJ0RPQ0tFUl9IT1NUJyxcbiAgJ0hUVFBfUFJPWFknLFxuICAnSFRUUFNfUFJPWFknLFxuICAnaHR0cF9wcm94eScsXG4gICdodHRwc19wcm94eScsXG4gICdGT1JDRV9DT0xPUicsXG4gICdNSU5JRkxBUkVfQ0FDSEVfRElSJyxcbiAgJ01JU0VfRU5WJyxcbiAgJ05PX0NPTE9SJyxcbiAgJ05FWFRfUFVCTElDX1dCX0VOVicsXG4gICdORVhUX1BVQkxJQ19XQl9WRVJTSU9OJyxcbiAgJ05PREVfRU5WJyxcbiAgJ1BPUlQnLFxuICAnV0JfRU5WJyxcbiAgJ1dCX1ZFUlNJT04nLFxuXSk7XG5cbmNvbnN0IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTID0gWydXUkFOR0xFUl8nLCAnQ0xPVURGTEFSRV9IWVBFUkRSSVZFX0xPQ0FMX0NPTk5FQ1RJT05fU1RSSU5HXycsICdDTE9VREZMQVJFX0NGX0ZFVENIXyddO1xuXG5mdW5jdGlvbiBpc05vblNlY3JldEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTk9OX1NFQ1JFVF9LRVlTLmhhcyhrZXkpIHx8IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBEZXBsb3lDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBEZXBsb3lDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxEZXBsb3lDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIERlcGxveUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOlxuICAgICdEZXBsb3kgYSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwICh2aW5leHQgb3IgcGxhaW4gV29ya2VyKSB0byB0aGUgV0JfRU5WIGVudmlyb25tZW50OiB2YWxpZGF0ZSBzZWNyZXRzLCBidWlsZCwgYXBwbHkgcmVtb3RlIEQxIG1pZ3JhdGlvbnMsIHRoZW4gZGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHlhcmdzIGFzIHVua25vd24gYXMgQXJndjxEZXBsb3lDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogRGVwbG95Q29tbWFuZEFyZ3YpIHtcbiAgICAvLyBBIHN0cmF5IGV4cG9ydGVkIENMT1VERkxBUkVfRU5WIHdvdWxkIGJha2UgdGhlIHdyb25nIGVudmlyb25tZW50IGludG8gdGhlIGJ1aWxkIGFuZFxuICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2Ugb24gZGVwbG95OyBpdCBpcyByZS1zZXQgZXhwbGljaXRseSB3aGVyZSBuZWVkZWQuXG4gICAgLy8gQSBkb3RlbnYgZmlsZSBkZWZpbmluZyBpdCBzdGlsbCBzdXJmYWNlcyB0aHJvdWdoIHByb2plY3QuZW52LCB3aGljaCB0aGUgZXhwbGljaXQgYC0tZW52YFxuICAgIC8vIGZsYWdzIGJlbG93IG92ZXJyaWRlLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DTE9VREZMQVJFX0VOVjtcblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHdyYW5nbGVyQ29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgaWYgKCF3cmFuZ2xlckNvbmZpZ1BhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCd3YiBkZXBsb3kgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKG5vIHdyYW5nbGVyIGNvbmZpZyBmb3VuZCkuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBlbnZOYW1lID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGlmICghZW52TmFtZSB8fCBlbnZOYW1lID09PSAnZGV2ZWxvcG1lbnQnIHx8IGVudk5hbWUgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBXQl9FTlYgbXVzdCBuYW1lIGEgZGVwbG95IGVudmlyb25tZW50IChlLmcuIHN0YWdpbmcgb3IgcHJvZHVjdGlvbiksIGJ1dCBpcyAke2Vudk5hbWV9LmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YWx1ZXMgZ28gaW50byBib3RoIHByb2Nlc3MuZW52IChpbmhlcml0ZWQgYnkgZXZlcnl0aGluZyB3YiBzcGF3bnMpIGFuZCBwcm9qZWN0LmVudlxuICAgIC8vICh0aGUgZW52aXJvbm1lbnQgd2IgaXRzZWxmIHJlYWRzIGFuZCBwYXNzZXMgZXhwbGljaXRseSk7IHRoZSBsYXR0ZXIgaXMgYSBjYWNoZWQgc25hcHNob3RcbiAgICAvLyB0YWtlbiBiZWZvcmUgdGhpcyBwb2ludCwgc28gd3JpdGluZyBvbmx5IHRvIHByb2Nlc3MuZW52IHdvdWxkIGxlYXZlIHdiJ3Mgb3duIHByZWZsaWdodCDigJRcbiAgICAvLyBhbmQgYW55IGNvbW1hbmQgc3Bhd25lZCB3aXRoIHByb2plY3QuZW52IOKAlCB3aXRob3V0IHRoZSB0b2tlbi5cbiAgICBjb25zdCBjbG91ZGZsYXJlRW52VmFycyA9IHJlYWRDbG91ZGZsYXJlRW52RmlsZXMocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjbG91ZGZsYXJlRW52VmFycykpIHtcbiAgICAgIC8vID8/PSBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgZXhwb3J0ZWQgZW1wdHkgdmFsdWUgc3RpbGwgd2lucyBvdmVyIHRoZSBmaWxlLlxuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA/Pz0gdmFsdWU7XG4gICAgICBwcm9qZWN0LmVudltrZXldID8/PSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkQ29uZmlnID0gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KHByb2plY3QsIGVudk5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlZENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBwYXJzZSAke3dyYW5nbGVyQ29uZmlnUGF0aH0uYCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBhY2NvdW50SWQgPSByZXNvbHZlZENvbmZpZy5hY2NvdW50SWQgPz8gcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BQ0NPVU5UX0lEO1xuICAgIC8vIFByZWZlciB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB3aGVuZXZlciB0aGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQncyBEMSBiaW5kaW5ncyBoYXZlIGFuXG4gICAgLy8gZXhpc3RpbmcgbWlncmF0aW9ucyBkaXJlY3RvcnkuIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBkb2VzIG5vdCBpbXBseSB0aGUgcHJvamVjdFxuICAgIC8vIG1pZ3JhdGVzIEQxIHdpdGggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlcjogdGhlIGV4cGxpY2l0IG1hcmtlciBpcyBhIGRyaXp6bGUgY29uZmlnXG4gICAgLy8gd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUgLyBkMS1odHRwIC8gZHVyYWJsZS1zcWxpdGUgKHNlZSB1c2VzRHJpenpsZUtpdEZvckQxO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk0MikuIEEgZHJpenpsZSBjb25maWcgdGFyZ2V0aW5nIGFub3RoZXJcbiAgICAvLyBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSBsZWF2ZXMgdGhlIEQxIGJpbmRpbmdzIHVubWFuYWdlZCBieSB3YiBkZXBsb3kuXG4gICAgY29uc3Qgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcyA9IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmZpbHRlcigoZGF0YWJhc2UpID0+XG4gICAgICB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3QsIGRhdGFiYXNlKVxuICAgICk7XG4gICAgY29uc3QgZHJpenpsZUtpdE1hbmFnZXNEMSA9IHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdCk7XG4gICAgaWYgKFxuICAgICAgZHJpenpsZUtpdE1hbmFnZXNEMSAmJlxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPiAwICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA8IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aFxuICAgICkge1xuICAgICAgLy8gTWlncmF0aW5nIG9ubHkgdGhlIHdyYW5nbGVyLW5hdGl2ZSBzdWJzZXQgd291bGQgc2lsZW50bHkgZGVwbG95IGNvZGUgYWdhaW5zdCB0aGVcbiAgICAgIC8vIG90aGVyLCB1bm1pZ3JhdGVkIGRhdGFiYXNlcy5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZCgnd2IgZGVwbG95IGRvZXMgbm90IHN1cHBvcnQgbWl4aW5nIHdyYW5nbGVyLW5hdGl2ZSBhbmQgbm9uLW5hdGl2ZSBEMSBtaWdyYXRpb24gbGF5b3V0cy4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZHJpenpsZUQxRGF0YWJhc2UgPVxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgZHJpenpsZUtpdE1hbmFnZXNEMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgIGlmICh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxICYmIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZCgnd2IgZGVwbG95IHN1cHBvcnRzIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgRDEgYmluZGluZzsgZm91bmQgbXVsdGlwbGUuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZWREMURhdGFiYXNlcyA9IG5ldyBTZXQod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcyk7XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSBtYW5hZ2VkRDFEYXRhYmFzZXMuYWRkKGRyaXp6bGVEMURhdGFiYXNlKTtcbiAgICBjb25zdCB1bm1hbmFnZWREMURhdGFiYXNlcyA9IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmZpbHRlcigoZGF0YWJhc2UpID0+ICFtYW5hZ2VkRDFEYXRhYmFzZXMuaGFzKGRhdGFiYXNlKSk7XG4gICAgaWYgKHVubWFuYWdlZEQxRGF0YWJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFNheSBzbyBvdXQgbG91ZCBpbnN0ZWFkIG9mIHNpbGVudGx5IGRlcGxveWluZyBjb2RlIGFnYWluc3QgdW5taWdyYXRlZCBkYXRhYmFzZXM6IHRoZVxuICAgICAgLy8gZHJpenpsZSBtYXJrZXIgZGV0ZWN0aW9uIGlzIGhldXJpc3RpYyAodGV4dCBzY2FuIG9mIGRyaXp6bGUuY29uZmlnLiopLCBzbyBhIHByb2plY3QgdGhhdFxuICAgICAgLy8gZ2VudWluZWx5IG1pZ3JhdGVzIEQxIG11c3QgYmUgYWJsZSB0byBub3RpY2Ugd2hlbiBubyBtZWNoYW5pc20gd2FzIHNlbGVjdGVkLiBUaGlzIGFsc29cbiAgICAgIC8vIGNvdmVycyBwYXJ0aWFsIGxheW91dHMgKHNvbWUgYmluZGluZ3Mgd3JhbmdsZXItbmF0aXZlLCBvdGhlcnMgdW5tYW5hZ2VkKS5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIGBObyBEMSBtaWdyYXRpb24gbWVjaGFuaXNtIGRldGVjdGVkIGZvciAke3VubWFuYWdlZEQxRGF0YWJhc2VzXG4gICAgICAgICAgICAubWFwKChkYXRhYmFzZSkgPT4gZGF0YWJhc2UuYmluZGluZyA/PyBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/ICd1bm5hbWVkIGJpbmRpbmcnKVxuICAgICAgICAgICAgLmpvaW4oJywgJyl9IGAgK1xuICAgICAgICAgICAgJyhubyB3cmFuZ2xlciBtaWdyYXRpb25zIGRpcmVjdG9yeSBhbmQgbm8gZHJpenpsZSBjb25maWcgdGFyZ2V0aW5nIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKTsgd2IgZGVwbG95IHdpbGwgbm90IHJ1biBEMSBtaWdyYXRpb25zIGZvciB0aGVtLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gRHJ5IHJ1bnMgZXhlY3V0ZSBub3RoaW5nIGF1dGhlbnRpY2F0ZWQsIHNvIHRoZXkgc2tpcCB0aGUgY3JlZGVudGlhbCBwcmVmbGlnaHQgZW50aXJlbHkuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgLy8gQSBkcml6emxlLXNlbGVjdGVkIEQxIGRhdGFiYXNlIHJvdXRlcyBib3RoIHRoZSBtaWdyYXRpb24gaW4gc3RlcCAzIGFuZCBhbnkgZGVwbG95L3Bvc3RcbiAgICAgIC8vIGhvb2sgdGhyb3VnaCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyLCB3aGljaCBuZWVkcyBDTE9VREZMQVJFX0FQSV9UT0tFTiBldmVuIGZvclxuICAgICAgLy8gbG9jYWwsIHdyYW5nbGVyLU9BdXRoIGRlcGxveXMuIEZhaWxpbmcgaGVyZSBrZWVwcyB0aGUgZmFpbC1mYXN0IG9yZGVyaW5nOiBhIG1pc3NpbmcgdG9rZW5cbiAgICAgIC8vIG11c3QgYWJvcnQgYmVmb3JlIHRoZSBkZXBsb3kgZ29lcyBsaXZlLCBub3QgZHVyaW5nIG1pZ3JhdGlvbiBvciBkZXBsb3kvcG9zdFxuICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk1NikuIFdyYW5nbGVyLW5hdGl2ZSBwcm9qZWN0cyAod2l0aCBvclxuICAgICAgLy8gd2l0aG91dCBob29rcykgbXVzdCBub3QgcmVxdWlyZSB0aGUgdG9rZW46IGEgbG9jYWwgd3JhbmdsZXIgT0F1dGggbG9naW4gc3VmZmljZXMgdGhlcmUsXG4gICAgICAvLyBldmVuIHRob3VnaCBzdGVwIDUgc3RpbGwgZXhwb3J0cyBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEIHRvIHRoZWlyIGhvb2tzLlxuICAgICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlICYmICFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnQ0xPVURGTEFSRV9BUElfVE9LRU4gaXMgcmVxdWlyZWQgZm9yIHJlbW90ZSBkcml6emxlLWtpdCBtaWdyYXRpb25zLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbiA9XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4gfHxcbiAgICAgICAgISFwcm9qZWN0LmVudi5DRl9BUElfVE9LRU4gfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfS0VZICYmIHByb2plY3QuZW52LkNMT1VERkxBUkVfRU1BSUwpIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNGX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0ZfRU1BSUwpO1xuICAgICAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpICYmICFoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXcmFuZ2xlciBhdXRoZW50aWNhdGlvbiAoZS5nLiBDTE9VREZMQVJFX0FQSV9UT0tFTikgaXMgcmVxdWlyZWQgdG8gZGVwbG95IG9uIENJLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcC1zcGVjaWZpYyB2YWxpZGF0aW9uIGhvb2sgKGUuZy4gc2VjcmV0IHBhaXJzIHRoYXQgbXVzdCBiZSBib3RoLXNldC1vci1ib3RoLWVtcHR5KS5cbiAgICAvLyBUaGUgcmV1c2FibGUgZGVwbG95LnltbCBhbHJlYWR5IHJ1bnMgaXQgb24gQ0k7IHJ1biBpdCBoZXJlIGZvciBsb2NhbCBkZXBsb3lzLlxuICAgIGlmICghaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9jaS1zZXR1cCddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9jaS1zZXR1cCcsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIC8vIDEuIFJlc29sdmUgYW5kIHZhbGlkYXRlIGFsbCBzZWNyZXRzIGJlZm9yZSBhbnkgYnVpbGQgb3IgcmVtb3RlIG11dGF0aW9uLCBzbyBhIG1pc3NpbmdcbiAgICAvLyAgICBzZWNyZXQgYWJvcnRzIHRoZSBkZXBsb3kgaW5zdGVhZCBvZiBsZWF2aW5nIGEgbWlncmF0ZWQgZGF0YWJhc2UgYmVoaW5kIGFuIG9sZCBXb3JrZXIuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIFJlc3RyaWN0IHRoZSBzZWNyZXRzIGRvbWFpbiB0byBrZXlzIHRoZSBwcm9qZWN0J3MgZm5veCBjb25maWd1cmF0aW9uIGRlY2xhcmVzOiBgbWlzZSBlbnZgXG4gICAgLy8gb3V0cHV0IChyZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UpIG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgc3VjaCBhcyBDQVJHT19IT01FLFxuICAgIC8vIHdoaWNoIG11c3QgbmV2ZXIgYmUgdXBsb2FkZWQgYXMgV29ya2VyIHNlY3JldHMuXG4gICAgY29uc3QgZm5veEtleXMgPSBuZXcgU2V0KFxuICAgICAgZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKVxuICAgICk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGlmICghZm5veEtleXMuaGFzKGtleSkpIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICAgIC8vIE5hbWVzIGRlY2xhcmVkIHZpYSB3cmFuZ2xlciBgc2VjcmV0cy5yZXF1aXJlZGAgbWF5IGxpa2V3aXNlIGJlIHN1cHBsaWVkIHB1cmVseSBhc1xuICAgIC8vIGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiBDSSB3b3JrZmxvdyBlbnYpIGluc3RlYWQgb2YgZm5veCB2YWx1ZXMuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVzb2x2ZWRDb25maWcucmVxdWlyZWRTZWNyZXROYW1lcykge1xuICAgICAgY29uc3QgZXhwb3J0ZWRWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBleHBvcnRlZFZhbHVlO1xuICAgIH1cbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IHdpbiBvdmVyIGRvdGVudiB2YWx1ZXMgKHByb2plY3QuZW52IGFscmVhZHlcbiAgICAvLyBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2IgZGVwbG95YCB3b3VsZCBwdXNoIHRoZSBzdGFsZSBmaWxlIHZhbHVlLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldHMgPSBzZWxlY3RXb3JrZXJTZWNyZXRzKGVudlZhcnMsIFsuLi5yZXNvbHZlZENvbmZpZy52YXJLZXlzLCAuLi5yZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNdKTtcbiAgICAvLyBgLS12YXIgV0JfVkVSU0lPTjouLi5gIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWd1cmF0aW9uIHZhbHVlcyBvbiBkZXBsb3ksIHNvIGFcbiAgICAvLyByZXNvdXJjZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSB3b3VsZCBzaWxlbnRseSBiZWNvbWUgYSBzdHJpbmcgdmFyaWFibGUuXG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04gJiYgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKCdXQl9WRVJTSU9OJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXQl9WRVJTSU9OIGNvbGxpZGVzIHdpdGggYSBXb3JrZXIgYmluZGluZyBuYW1lOyByZW5hbWUgdGhlIGJpbmRpbmcuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBiaW5kaW5nQ29sbGlzaW9ucyA9IE9iamVjdC5rZXlzKGVudlZhcnMpLmZpbHRlcigoa2V5KSA9PiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgaWYgKGJpbmRpbmdDb2xsaXNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFVwbG9hZGluZyBhIHNlY3JldCBuYW1lZCBsaWtlIGEgYmluZGluZyB3b3VsZCByZXBsYWNlIHRoZSBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgZW52IGtleXMgdGhhdCBjb2xsaWRlIHdpdGggV29ya2VyIGJpbmRpbmcgbmFtZXM6ICR7YmluZGluZ0NvbGxpc2lvbnMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGBzZWNyZXRzLnJlcXVpcmVkYCBvbmx5IGR1cmluZyB0aGUgcmVhbCB1cGxvYWQg4oCUIGFmdGVyIG1pZ3JhdGlvbnMg4oCUXG4gICAgLy8gc28gd2IgY2hlY2tzIHVwZnJvbnQ6IGVhY2ggcmVxdWlyZWQgbmFtZSBtdXN0IGJlIGEga2V5IGluIHRoZSBvdXRnb2luZyBwYXlsb2FkIChwcmVzZW5jZSxcbiAgICAvLyBub3QgdHJ1dGhpbmVzcyDigJQgYW4gZXhwbGljaXQgZW1wdHkgY2xlYXJzIGEgc3RhbGUgdmFsdWUpIG9yIGFuIGVmZmVjdGl2ZSB2YXIvYmluZGluZy5cbiAgICBjb25zdCB1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMgPSByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzLmZpbHRlcihcbiAgICAgIChuYW1lKSA9PlxuICAgICAgICAhT2JqZWN0Lmhhc093bihzZWNyZXRzLCBuYW1lKSAmJlxuICAgICAgICAhcmVzb2x2ZWRDb25maWcudmFyS2V5cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICAgICAhcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKG5hbWUpXG4gICAgKTtcbiAgICBpZiAodW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgU2VjcmV0cyByZXF1aXJlZCBieSB0aGUgd3JhbmdsZXIgY29uZmlnIGFyZSBub3QgcHJvdmlkZWQ6ICR7dW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9YFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBzZWNyZXRLZXlzID0gT2JqZWN0LmtleXMoc2VjcmV0cykudG9Tb3J0ZWQoKTtcbiAgICAvLyBDbG91ZGZsYXJlIGxpbWl0cyBhIGJ1bGsgdXBsb2FkIHRvIDEwMCBzZWNyZXRzLCBlYWNoIHZhcmlhYmxlL3NlY3JldCB2YWx1ZSB0byA1IEtCLCBhbmRcbiAgICAvLyB0aGUgY29tYmluZWQgdmFyaWFibGUrc2VjcmV0IGNvdW50IHRvIDEyOCAoNjQgb24gdGhlIEZyZWUgcGxhbiwgd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkXG4gICAgLy8gaGVyZSDigJQgaGVuY2UgYSB3YXJuaW5nKS4gRmFpbGluZyBiZWZvcmUgYW55IGJ1aWxkIG9yIG1pZ3JhdGlvbiBrZWVwcyBhbiBvdmVyc2l6ZWQgcGF5bG9hZFxuICAgIC8vIGZyb20gYWJvcnRpbmcgdGhlIGRlcGxveSBhZnRlciByZW1vdGUgbWlncmF0aW9ucyBhbHJlYWR5IHJhbi5cbiAgICBpZiAoc2VjcmV0S2V5cy5sZW5ndGggPiAxMDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgQ2xvdWRmbGFyZSBhY2NlcHRzIGF0IG1vc3QgMTAwIHNlY3JldHMgcGVyIGRlcGxveSwgYnV0ICR7c2VjcmV0S2V5cy5sZW5ndGh9IHdlcmUgc2VsZWN0ZWQuYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFRoZSBDTEktcHJvdmlkZWQgV0JfVkVSU0lPTiBvdmVybGF5cyBhIGNvbmZpZ3VyZWQgdmFyIG9mIHRoZSBzYW1lIG5hbWUgb24gZGVwbG95LFxuICAgIC8vIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGxpbWl0IGNoZWNrcy5cbiAgICBjb25zdCBlZmZlY3RpdmVWYXJzID0gbmV3IE1hcChPYmplY3QuZW50cmllczx1bmtub3duPihyZXNvbHZlZENvbmZpZy52YXJzKSk7XG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04pIGVmZmVjdGl2ZVZhcnMuc2V0KCdXQl9WRVJTSU9OJywgcHJvamVjdC5lbnYuV0JfVkVSU0lPTik7XG4gICAgY29uc3QgdmFyRW50cmllcyA9IFsuLi5lZmZlY3RpdmVWYXJzXTtcbiAgICBjb25zdCBvdmVyc2l6ZWRLZXlzID0gW1xuICAgICAgLi4uc2VjcmV0S2V5cy5maWx0ZXIoKGtleSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgoc2VjcmV0c1trZXldID8/ICcnLCAndXRmOCcpID4gNSAqIDEwMjQpLFxuICAgICAgLi4udmFyRW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbLCB2YWx1ZV0pID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKSwgJ3V0ZjgnKSA+IDUgKiAxMDI0XG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleV0pID0+IGtleSksXG4gICAgXTtcbiAgICBpZiAob3ZlcnNpemVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVmFyaWFibGUgb3Igc2VjcmV0IHZhbHVlcyBleGNlZWQgQ2xvdWRmbGFyZSdzIDUgS0IgbGltaXQ6ICR7b3ZlcnNpemVkS2V5cy5qb2luKCcsICcpfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gYC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZTogcmVtb3RlIHNlY3JldHMgYWJzZW50IGZyb20gdGhlIHBheWxvYWQgc3RheSBhdHRhY2hlZCB0byB0aGVcbiAgICAvLyBuZXcgdmVyc2lvbiwgc28gdGhleSBjb3VudCBhZ2FpbnN0IHRoZSBjb21iaW5lZCBsaW1pdCB0b28uIExpc3RpbmcgdGhlbSBuZWVkcyBhblxuICAgIC8vIGF1dGhlbnRpY2F0ZWQgcmVtb3RlIHJvdW5kLXRyaXAsIHdoaWNoIGRyeSBydW5zIHNraXA7IHdoZW4gdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueVxuICAgIC8vIHJlYXNvbiBvdGhlciB0aGFuIGEgbm90LXlldC1jcmVhdGVkIFdvcmtlciwgZGVncmFkZSB0byB0aGUgbG9jYWwtb25seSBjb3VudCBpbnN0ZWFkIG9mXG4gICAgLy8gYmxvY2tpbmcgYSBkZXBsb3kgdGhhdCB3cmFuZ2xlciBpdHNlbGYgbWlnaHQgYWNjZXB0LlxuICAgIGNvbnN0IHJlbW90ZVNlY3JldE5hbWVzID0gYXJndi5kcnlSdW5cbiAgICAgID8gW11cbiAgICAgIDogYXdhaXQgbGlzdFJlbW90ZVdvcmtlclNlY3JldE5hbWVzKHByb2plY3QsIGFyZ3YsIHdyYW5nbGVyQ29uZmlnUGF0aCwgcmVzb2x2ZWRDb25maWcsIGVudk5hbWUpO1xuICAgIGNvbnN0IGluaGVyaXRlZFNlY3JldE5hbWVzID0gc2VsZWN0SW5oZXJpdGVkUmVtb3RlU2VjcmV0TmFtZXMoXG4gICAgICByZW1vdGVTZWNyZXROYW1lcyA/PyBbXSxcbiAgICAgIHNlY3JldHMsXG4gICAgICB2YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSksXG4gICAgICByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNcbiAgICApO1xuICAgIGNvbnN0IGNvbWJpbmVkQ291bnQgPVxuICAgICAgbmV3IFNldChbLi4uc2VjcmV0S2V5cywgLi4udmFyRW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpXSkuc2l6ZSArIGluaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBpbmhlcml0ZWROb3RlID1cbiAgICAgIGluaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgIChpbmNsdWRpbmcgJHtpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGh9IHJlbW90ZSBzZWNyZXRzIGtlcHQgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbjogJHtpbmhlcml0ZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfSlgXG4gICAgICAgIDogJyc7XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiAxMjgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgQ2xvdWRmbGFyZSBhbGxvd3MgYXQgbW9zdCAxMjggdmFyaWFibGVzIGFuZCBzZWNyZXRzIGNvbWJpbmVkLCBidXQgJHtjb21iaW5lZENvdW50fSB3ZXJlIHNlbGVjdGVkJHtpbmhlcml0ZWROb3RlfS5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmIChjb21iaW5lZENvdW50ID4gNjQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGAke2NvbWJpbmVkQ291bnR9IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyR7aW5oZXJpdGVkTm90ZX0gZXhjZWVkIHRoZSBGcmVlIHBsYW4ncyBsaW1pdCBvZiA2NC5gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgYERlcGxveWluZyAke3Jlc29sdmVkQ29uZmlnLndvcmtlck5hbWUgPz8gcHJvamVjdC5uYW1lfSAoJHtlbnZOYW1lfSkgd2l0aCAke3NlY3JldEtleXMubGVuZ3RofSBzZWNyZXRzOiAke3NlY3JldEtleXMuam9pbignLCAnKX1gXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIDIuIEJ1aWxkICh2aW5leHQgZW1iZWRzIHRoZSBlbnZpcm9ubWVudC1hcHBsaWVkIHdyYW5nbGVyIGNvbmZpZyBpbnRvIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24pLlxuICAgIC8vICAgIEJ1aWxkaW5nIGJlZm9yZSBtaWdyYXRpbmcga2VlcHMgYSBidWlsZCBmYWlsdXJlIGZyb20gbGVhdmluZyBhIG1pZ3JhdGVkIHNjaGVtYSBiZWhpbmRcbiAgICAvLyAgICB0aGUgb2xkIFdvcmtlci4gUGxhaW4gV29ya2VycyBoYXZlIG5vIGJ1aWxkIHN0ZXA7IHdyYW5nbGVyIGJ1bmRsZXMgdGhlIGVudHJ5IGl0c2VsZi5cbiAgICBjb25zdCBpc1ZpbmV4dCA9ICEhKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aW5leHQgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpbmV4dCk7XG4gICAgY29uc3QgZGVwbG95Q29uZmlnUGF0aCA9IGlzVmluZXh0ID8gcGF0aC5qb2luKCdkaXN0JywgJ3NlcnZlcicsICd3cmFuZ2xlci5qc29uJykgOiB3cmFuZ2xlckNvbmZpZ1BhdGg7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudkFzc2lnbm1lbnQgPSByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvblxuICAgICAgPyBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdDTE9VREZMQVJFX0VOVicsIGVudk5hbWUpfSBgXG4gICAgICA6ICcnO1xuICAgIGlmIChpc1ZpbmV4dCkge1xuICAgICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04pIHtcbiAgICAgICAgcHJvamVjdC5lbnYuTkVYVF9QVUJMSUNfV0JfVkVSU0lPTiB8fD0gcHJvamVjdC5lbnYuV0JfVkVSU0lPTjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGdlbi1jb2RlJywgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7Y2xvdWRmbGFyZUVudkFzc2lnbm1lbnR9WUFSTiB2aW5leHQgYnVpbGRgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIE9uIGRyeSBydW5zIHRoZSB2aW5leHQgYnVpbGQgYWJvdmUgaXMgYSBwcmludGVkIG5vLW9wLCBzbyB0aGUgYnVpbHQgY29uZmlnIGlzXG4gICAgICAvLyBsZWdpdGltYXRlbHkgYWJzZW50IGFuZCBtdXN0IG5vdCBhYm9ydCB0aGUgcnVuLlxuICAgICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkZXBsb3lDb25maWdQYXRoKSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYCR7ZGVwbG95Q29uZmlnUGF0aH0gbm90IGZvdW5kOyB0aGUgdmluZXh0IGJ1aWxkIGRpZCBub3QgcHJvZHVjZSBhIGRlcGxveSBjb25maWcuYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgaXRzIGNvbmZpZyBzY2hlbWEgb25seSB3aGVuIGl0IHJ1bnMsIHNvIGEgZHJ5IHJ1biBvZiB0aGUgYnVpbHRcbiAgICAgIC8vIGNvbmZpZyBzdXJmYWNlcyBjb25maWcgYW5kIGJ1bmRsZSBlcnJvcnMgQkVGT1JFIHRoZSByZW1vdGUgbWlncmF0aW9ucyBiZWxvdyBtdXRhdGVcbiAgICAgIC8vIHRoZSBkYXRhYmFzZSwgbWlycm9yaW5nIHRoZSBwbGFpbi1Xb3JrZXIgZHJ5IHJ1bi4gTm8gLS1lbnY6IHRoZSBidWlsdCBjb25maWcgYWxyZWFkeVxuICAgICAgLy8gaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgWUFSTiB3cmFuZ2xlciBkZXBsb3kgLS1kcnktcnVuIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudChkZXBsb3lDb25maWdQYXRoKX1gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQbGFpbiBXb3JrZXJzIGFyZSBmaXJzdCBjb21waWxlZCBieSB3cmFuZ2xlciBkdXJpbmcgdGhlIGRlcGxveSBpdHNlbGY7IGEgZHJ5IHJ1blxuICAgICAgLy8gc3VyZmFjZXMgY29tcGlsZSBlcnJvcnMgKGUuZy4gYSBtaXNzaW5nIGVudHJ5IHBvaW50KSBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zXG4gICAgICAvLyBiZWxvdyBtdXRhdGUgdGhlIGRhdGFiYXNlLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgWUFSTiB3cmFuZ2xlciBkZXBsb3kgLS1kcnktcnVuIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7cmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyd9YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBBcHBseSBEMSBtaWdyYXRpb25zIHRvIHRoZSByZW1vdGUgZGF0YWJhc2Ugd2l0aCB0aGUgcHJvamVjdCdzIHNpbmdsZSBtaWdyYXRpb25cbiAgICAvLyAgICBtZWNoYW5pc20gKHdyYW5nbGVyLW5hdGl2ZSB3aGVuIGEgbWlncmF0aW9ucyBkaXJlY3RvcnkgZXhpc3RzLCBlbHNlIGRyaXp6bGUta2l0IHdoZW5cbiAgICAvLyAgICB0aGUgZHJpenpsZSBjb25maWcgdGFyZ2V0cyBzcWxpdGUvZDEtaHR0cC9kdXJhYmxlLXNxbGl0ZSkuIE1pZ3JhdGlvbnMgbXVzdCBiZSBiYWNrd2FyZFxuICAgIC8vICAgIGNvbXBhdGlibGU6IHRoZSBvbGQgV29ya2VyIHNlcnZlc1xuICAgIC8vICAgIHRyYWZmaWMgdW50aWwgdGhlIGRlcGxveSBiZWxvdy5cbiAgICBjb25zdCBlbnZPcHRpb24gPSByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJztcbiAgICBmb3IgKGNvbnN0IGRhdGFiYXNlIG9mIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gZGF0YWJhc2UuYmluZGluZztcbiAgICAgIGlmICghZGF0YWJhc2VOYW1lKSBjb250aW51ZTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7c2hlbGxFc2NhcGVBcmd1bWVudChkYXRhYmFzZU5hbWUpfSAtLXJlbW90ZSAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQod3JhbmdsZXJDb25maWdQYXRoKX0ke2Vudk9wdGlvbn1gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIHtcbiAgICAgIGlmICghZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFRoZSAke2Vudk5hbWV9IEQxIGJpbmRpbmcgaGFzIG5vIGRhdGFiYXNlX2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcuYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBpZiAoIWFjY291bnRJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICdDTE9VREZMQVJFX0FDQ09VTlRfSUQgKG9yIGFjY291bnRfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZykgaXMgcmVxdWlyZWQgZm9yIHJlbW90ZSBkcml6emxlLWtpdCBtaWdyYXRpb25zLidcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYnVpbGREcml6emxlS2l0Q29tbWFuZChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICdtaWdyYXRlJyxcbiAgICAgICAgICBgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRD0ke2RyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkfSBDTE9VREZMQVJFX0FDQ09VTlRfSUQ9JHthY2NvdW50SWR9YFxuICAgICAgICApLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDQuIERlcGxveSBjb2RlIGFuZCBzZWNyZXRzIGF0b21pY2FsbHkgKG5vIHBvc3QtZGVwbG95IHNlY3JldCBwdXNoIHRoYXQgY291bGQgbGVhdmUgdGhlXG4gICAgLy8gICAgbmV3IHZlcnNpb24gcnVubmluZyB3aXRob3V0IOKAlCBvciB3aXRoIHN0YWxlIOKAlCBzZWNyZXRzKS4gVGhlIHNlY3JldHMgSlNPTiBnb2VzIHRocm91Z2hcbiAgICAvLyAgICBhIG1vZGUtMDYwMCBmaWxlIGluIGEgcHJpdmF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGRlbGV0ZWQgcmlnaHQgYWZ0ZXIgdGhlIGRlcGxveTpcbiAgICAvLyAgICAvZGV2L3N0ZGluIGlzIE5PVCByZWxpYWJsZSBoZXJlIGJlY2F1c2Ugd3JhbmdsZXIgcmVhZHMgdGhlIHNlY3JldHMgZmlsZSBvbmx5IGFmdGVyXG4gICAgLy8gICAgdXBsb2FkaW5nIGFzc2V0cywgYnkgd2hpY2ggcG9pbnQgdGhlIHBpcGVkIHN0ZGluIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjb25zdW1lZCDigJRcbiAgICAvLyAgICBvYnNlcnZlZCBhcyBhIGZsYWt5IGBDb3VsZCBub3QgcmVhZCBmaWxlOiAvZGV2L3N0ZGluYCBvbiBDSS4gRXhwbGljaXRseSBlbXB0eSB2YWx1ZXNcbiAgICAvLyAgICBzdGF5IGluIHRoZSBwYXlsb2FkOiAtLXNlY3JldHMtZmlsZSBpcyBhZGRpdGl2ZSwgc28gcHVzaGluZyAnJyBpcyB0aGUgb25seSB3YXkgdG9cbiAgICAvLyAgICBjbGVhciBhIHN0YWxlIHNlY3JldC5cbiAgICBjb25zdCBkZXBsb3lBcmdzID0gW1xuICAgICAgJ2RlcGxveScsXG4gICAgICAnLS1jb25maWcnLFxuICAgICAgZGVwbG95Q29uZmlnUGF0aCxcbiAgICAgIC8vIHZpbmV4dCdzIGJ1aWx0IGNvbmZpZyBhbHJlYWR5IGhhcyB0aGUgZW52aXJvbm1lbnQgYXBwbGllZDsgcGFzc2luZyAtLWVudiB0aGVyZSB3b3VsZFxuICAgICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZS5cbiAgICAgIC4uLighaXNWaW5leHQgJiYgcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5lbnYuV0JfVkVSU0lPTiA/IFsnLS12YXInLCBgV0JfVkVSU0lPTjoke3Byb2plY3QuZW52LldCX1ZFUlNJT059YF0gOiBbXSksXG4gICAgICAnLS1zZWNyZXRzLWZpbGUnLFxuICAgIF07XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6IHdyYW5nbGVyICR7ZGVwbG95QXJncy5qb2luKCcgJyl9IDx0ZW1wb3Jhcnkgc2VjcmV0cyBmaWxlPmApKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmVwYXJlTG9jYWxCaW5QYXRoKHByb2plY3QpO1xuICAgICAgY29uc3QgZGVwbG95RW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICAgICAgZGVsZXRlIGRlcGxveUVudi5DTE9VREZMQVJFX0VOVjtcbiAgICAgIC8vIDBvNzAwIGRpcmVjdG9yeSArIDBvNjAwIGZpbGU6IHJlYWRhYmxlIG9ubHkgYnkgdGhlIGRlcGxveWluZyB1c2VyLCBsaWtlIHRoZSBkb3RlbnZcbiAgICAgIC8vIGZpbGVzIHRoZSBDSSB3b3JrZmxvdyBhbHJlYWR5IHdyaXRlcyBuZXh0IHRvIGl0LiB3cmFuZ2xlciBydW5zIHRocm91Z2ggYW4gYXN5bmMgc3Bhd25cbiAgICAgIC8vIChzcGF3blN5bmMgd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AsIHNvIGEgc2h1dGRvd24gc2lnbmFsIHdvdWxkIGtpbGwgdGhlIHByb2Nlc3NcbiAgICAgIC8vIGJlZm9yZSBhbnkgY2xlYW51cCkgYW5kIHRoZSBkaXJlY3RvcnkgaXMgcmVtb3ZlZCBpbiBhIGZpbmFsbHksIHNvIGFuIGludGVycnVwdGVkXG4gICAgICAvLyBkZXBsb3kgY2Fubm90IGxlYXZlIHRoZSBwbGFpbnRleHQgc2VjcmV0cyBiZWhpbmQuIFNodXRkb3duIGhhbmRsaW5nIGRldGFpbHM6XG4gICAgICAvLyAtIEhhbmRsZXJzIChpbmNsdWRpbmcgU0lHSFVQLCBvbiB3aGljaCBOb2RlIGFsc28gdGVybWluYXRlcyBieSBkZWZhdWx0KSBhcmUgaW5zdGFsbGVkXG4gICAgICAvLyAgIEJFRk9SRSB0aGUgZmlsZSBpcyB3cml0dGVuIGFuZCB1c2UgcHJvY2Vzcy5vbiwgbm90IG9uY2UsIHNvIGEgcmVwZWF0ZWQgc2lnbmFsIGNhbm5vdFxuICAgICAgLy8gICBmYWxsIGJhY2sgdG8gZGVmYXVsdCB0ZXJtaW5hdGlvbiBhbmQgYnlwYXNzIHRoZSBmaW5hbGx5IGNsZWFudXAuXG4gICAgICAvLyAtIFNJR0hVUC9TSUdRVUlUIGFyZSBmb3J3YXJkZWQgdG8gd3JhbmdsZXIgYXMgU0lHVEVSTTogd3JhbmdsZXIncyBsYXVuY2hlciByZWxheXMgb25seVxuICAgICAgLy8gICBTSUdJTlQvU0lHVEVSTSB0byBpdHMgaW5uZXIgTm9kZSBwcm9jZXNzLCBhbmQgYW55dGhpbmcgZWxzZSB3b3VsZCBvcnBoYW4gYSBkZXBsb3ltZW50XG4gICAgICAvLyAgIHRoYXQga2VlcHMgbXV0YXRpbmcgdGhlIHJlbW90ZSBXb3JrZXIgYWZ0ZXIgd2IgZXhpdHMuXG4gICAgICAvLyAtIFRoZSByZS1yYWlzZSBiZWxvdyB1c2VzIHRoZSBzaWduYWwgd2IgaXRzZWxmIHJlY2VpdmVkOiB3cmFuZ2xlciBjYXRjaGVzIFNJR0lOVCBhbmRcbiAgICAgIC8vICAgZXhpdHMgbnVtZXJpY2FsbHkgKGUuZy4gMTQzKSwgd2hpY2ggbXVzdCBub3QgbWFzcXVlcmFkZSBhcyBhbiBvcmRpbmFyeSBmYWlsdXJlLlxuICAgICAgY29uc3Qgc2VjcmV0c0RpclBhdGggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3Yi1kZXBsb3ktJykpO1xuICAgICAgY29uc3Qgc2h1dGRvd25TaWduYWxzID0gWydTSUdIVVAnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddIGFzIGNvbnN0O1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgbGV0IHdyYW5nbGVyUHJvY2VzczogUmV0dXJuVHlwZTx0eXBlb2Ygc3Bhd24+IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHJlY2VpdmVkU2h1dGRvd25TaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgICAgICAgIGlmICh3cmFuZ2xlclByb2Nlc3MpIHtcbiAgICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5raWxsKHNpZ25hbCA9PT0gJ1NJR0lOVCcgfHwgc2lnbmFsID09PSAnU0lHVEVSTScgPyBzaWduYWwgOiAnU0lHVEVSTScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtzaHV0ZG93blNpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnMucm1TeW5jKHNlY3JldHNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAvLyBXaXRoIHRoZSBoYW5kbGVycyByZW1vdmVkLCByZS1yYWlzaW5nIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxuICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGxldCBkZXBsb3lTdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlY3JldHNGaWxlUGF0aCA9IHBhdGguam9pbihzZWNyZXRzRGlyUGF0aCwgJ3NlY3JldHMuanNvbicpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHNlY3JldHNGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VjcmV0cyksIHsgbW9kZTogMG82MDAgfSk7XG4gICAgICAgIGRlcGxveVN0YXR1cyA9IGF3YWl0IG5ldyBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3MgPSBzcGF3bignd3JhbmdsZXInLCBbLi4uZGVwbG95QXJncywgc2VjcmV0c0ZpbGVQYXRoXSwge1xuICAgICAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBlbnY6IGRlcGxveUVudiBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUoMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzaWduYWwgPyAxIDogKGNvZGUgPz8gdW5kZWZpbmVkKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gcHJvY2Vzcy5leGl0IHNraXBzIGZpbmFsbHkgYmxvY2tzLCBzbyB0aGUgZXhpdC1vbi1mYWlsdXJlIGJlbG93IHN0YXlzIG91dHNpZGUuXG4gICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWNlaXZlZFNodXRkb3duU2lnbmFsKSB7XG4gICAgICAgIC8vIFJlLXJhaXNlIHNvIHRoZSBjYWxsZXIgb2JzZXJ2ZXMgdGhlIHNhbWUgc2lnbmFsLWRlcml2ZWQgZXhpdCBzdGF0dXMuXG4gICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkZXBsb3lTdGF0dXMgIT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYHdyYW5nbGVyIGRlcGxveSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtkZXBsb3lTdGF0dXMgPz8gJ3Vua25vd24nfS5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdChkZXBsb3lTdGF0dXMgPz8gMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gT3B0aW9uYWwgcG9zdC1kZXBsb3kgaG9vayAoZS5nLiBzZWVkaW5nIHRoZSByZW1vdGUgRDEgdmlhIGRyaXp6bGUncyBkMS1odHRwIGRyaXZlcikuXG4gICAgLy8gICAgQXNzaWduIHRoZSByZXNvbHZlZCBpZHMgdW5jb25kaXRpb25hbGx5OiBhIHN0YWxlIGV4cG9ydGVkIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSURcbiAgICAvLyAgICBtdXN0IG5vdCByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L3Bvc3QnXSkge1xuICAgICAgLy8gVGhlIGlkIGlzIHVuYW1iaWd1b3VzIG9ubHkgd2l0aCBhIHNpbmdsZSBEMSBiaW5kaW5nOyB3aXRoIG11bHRpcGxlLCB0aGUgaG9vayBtdXN0XG4gICAgICAvLyByZXNvbHZlIGl0cyB0YXJnZXQgaXRzZWxmLiBDbGVhciBmaXJzdCBlaXRoZXIgd2F5OiBhIHN0YWxlIGluaGVyaXRlZCBpZCBtdXN0IG5vdFxuICAgICAgLy8gcmVkaXJlY3QgdGhlIGhvb2sgdG8gYW5vdGhlciBkYXRhYmFzZS5cbiAgICAgIGNvbnN0IGhvb2tEMURhdGFiYXNlOiBXcmFuZ2xlckQxRGF0YWJhc2UgfCB1bmRlZmluZWQgPVxuICAgICAgICByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPT09IDEgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICAgIGRlbGV0ZSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEO1xuICAgICAgaWYgKHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnTXVsdGlwbGUgRDEgYmluZGluZ3MgZXhpc3Q7IENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgaXMgbm90IHNldCBmb3IgZGVwbG95L3Bvc3QuJykpO1xuICAgICAgfVxuICAgICAgaWYgKGhvb2tEMURhdGFiYXNlPy5kYXRhYmFzZV9pZCkgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCA9IGhvb2tEMURhdGFiYXNlLmRhdGFiYXNlX2lkO1xuICAgICAgaWYgKGFjY291bnRJZCkgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BQ0NPVU5UX0lEID0gYWNjb3VudElkO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBkZXBsb3kvcG9zdCcsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUmVhZCB0aGUgQ2xvdWRmbGFyZSBBUEkgdG9rZW4gdGhhdCBDSSBkcm9wcyBpbiBhIGAuZW52LmNsb3VkZmxhcmVgIGZpbGUgKGUuZy4gdGhlIHJldXNhYmxlXG4gKiBkZXBsb3kgd29ya2Zsb3cncyBgZmlsZV9wYXRoXzFgKSwgbG9va2luZyBiZXNpZGUgdGhlIFdvcmtlcidzIHdyYW5nbGVyIGNvbmZpZyBhbmQgYXQgdGhlXG4gKiBtb25vcmVwbyByb290IOKAlCBgZmlsZV9wYXRoXzFgIGlzIHJlcG8tcmVsYXRpdmUsIHNvIGJvdGggc3BlbGxpbmdzIG9jY3VyIGluIHByYWN0aWNlLlxuICogTmVhcmVyIGZpbGVzIHdpbjogYSB3b3Jrc3BhY2UgbWF5IG92ZXJyaWRlIHRoZSByb290IHRva2VuLCBuZXZlciB0aGUgcmV2ZXJzZS5cbiAqIGBDTE9VREZMQVJFX0VOVmAgaXMgZHJvcHBlZDsgaXQgd291bGQgZG91YmxlLWFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgY3VycmVudERpclBhdGggb2YgbmV3IFNldChyb290RGlyUGF0aCA/IFtkaXJQYXRoLCByb290RGlyUGF0aF0gOiBbZGlyUGF0aF0pKSB7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICcuZW52LmNsb3VkZmxhcmUnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xvdWRmbGFyZUVudlBhdGgpKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBjbG91ZGZsYXJlRW52UGF0aCwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICBpZiAoa2V5ID09PSAnQ0xPVURGTEFSRV9FTlYnKSBjb250aW51ZTtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc2VjcmV0cyB0byBwdXNoIHRvIHRoZSBXb3JrZXIgZnJvbSB0aGUgZG90ZW52LWxvYWRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiBldmVyeSBleHBsaWNpdGx5IHNldCB2YWx1ZSDigJQgaW5jbHVkaW5nIGVtcHR5IHN0cmluZ3MsIHdoaWNoIGNsZWFyIHN0YWxlIHJlbW90ZSBzZWNyZXRzXG4gKiBzaW5jZSBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZSDigJQgZXhjZXB0IHdyYW5nbGVyIGB2YXJzYCAoYSBzZWNyZXQgbWF5XG4gKiBub3Qgc2hhcmUgYSBuYW1lIHdpdGggYSB2YXIpLCBkZXBsb3ktY29udHJvbCBrZXlzLCBhbmQgbG9jYWwgYGZpbGU6YCBEQVRBQkFTRV9VUkxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V29ya2VyU2VjcmV0cyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb25maWdWYXJLZXlzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjb25maWdLZXlzID0gbmV3IFNldChjb25maWdWYXJLZXlzKTtcbiAgY29uc3Qgc2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBObyBydW50aW1lIHVuZGVmaW5lZCBjaGVjayBvbiBgdmFsdWVgOiBlbnZWYXJzIGlzIGJ1aWx0IGV4Y2x1c2l2ZWx5IGZyb20gZG90ZW52LXBhcnNlZFxuICAvLyBzdHJpbmdzLCBhbmQgZXZlcnkgY2FsbGVyLXNpZGUgbWVyZ2UgZWl0aGVyIGNvYWxlc2NlcyB3aXRoIGA/PyAnJ2Agb3IgZ3VhcmRzIGFnYWluc3RcbiAgLy8gdW5kZWZpbmVkIGJlZm9yZSBhc3NpZ25pbmcsIHNvIHRoZSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHR5cGUgaG9sZHMgYXQgcnVudGltZSB0b28uXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKGNvbmZpZ0tleXMuaGFzKGtleSkgfHwgaXNOb25TZWNyZXRLZXkoa2V5KSkgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ0RBVEFCQVNFX1VSTCcgJiYgdmFsdWUuc3RhcnRzV2l0aCgnZmlsZTonKSkgY29udGludWU7XG4gICAgc2VjcmV0c1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHNlY3JldHM7XG59XG5cbi8qKlxuICogTGlzdCB0aGUgc2VjcmV0IG5hbWVzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgZGVwbG95IHRhcmdldCBXb3JrZXIuIFJldHVybnMgdW5kZWZpbmVkIHdoZW5cbiAqIHRoZSBsaXN0aW5nIGZhaWxzIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gdGhlIFdvcmtlciBub3QgZXhpc3RpbmcgeWV0IChmaXJzdCBkZXBsb3kpLCBzb1xuICogdGhlIGNhbGxlciBjYW4gZGVncmFkZSB0byB0aGUgbG9jYWwtb25seSBsaW1pdCBjaGVja3MgaW5zdGVhZCBvZiBibG9ja2luZyBhIGRlcGxveSB0aGF0XG4gKiB3cmFuZ2xlciBpdHNlbGYgbWlnaHQgYWNjZXB0LiBGYWlsaW5nIGNsb3NlZCBpbnN0ZWFkIHdvdWxkIHR1cm4gZXZlcnkgdHJhbnNpZW50IGxpc3RpbmdcbiAqIGZhaWx1cmUgKG5ldHdvcmssIGEgdG9rZW4gd2l0aG91dCBzZWNyZXQtcmVhZCBwZXJtaXNzaW9uKSBpbnRvIGEgZGVwbG95IGJsb2NrZXIsIGFuZCDigJQgc2luY2VcbiAqIHdyYW5nbGVyIDQueCByZXBvcnRzIGEgbWlzc2luZyBXb3JrZXIgb25seSB2aWEgYW4gZXJyb3ItbWVzc2FnZSBoaW50IOKAlCBhbnkgdW5yZWNvZ25pemVkXG4gKiBub3QtZm91bmQgc2hhcGUgd291bGQgdGhlbiBibG9jayBmaXJzdCBkZXBsb3lzIGVudGlyZWx5OyB0aGlzIHByZWZsaWdodCBtdXN0IG9ubHkgZXZlciBhZGRcbiAqIGZhaWx1cmVzIHRoYXQgd3JhbmdsZXIgaXRzZWxmIHdvdWxkIHJhaXNlIGFmdGVyIHRoZSBtaWdyYXRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2LFxuICB3cmFuZ2xlckNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcsXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICBwcmVwYXJlTG9jYWxCaW5QYXRoKHByb2plY3QpO1xuICBjb25zdCBsaXN0QXJncyA9IFtcbiAgICAnc2VjcmV0JyxcbiAgICAnbGlzdCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tY29uZmlnJyxcbiAgICB3cmFuZ2xlckNvbmZpZ1BhdGgsXG4gICAgLi4uKHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICBdO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtsaXN0QXJncy5qb2luKCcgJyl9YCkpO1xuICBsZXQgcmV0O1xuICB0cnkge1xuICAgIHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ3dyYW5nbGVyJywgbGlzdEFyZ3MsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudiBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgYEZhaWxlZCB0byBydW4gd3JhbmdsZXIgdG8gbGlzdCByZW1vdGUgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAocmV0LnN0YXR1cyA9PT0gMCkge1xuICAgIC8vIEN1dCB0aGUgSlNPTiBhcnJheSBvdXQgb2YgdGhlIHN1cnJvdW5kaW5nIG91dHB1dDogd3JhbmdsZXIgbWF5IHByaW50IGl0cyBiYW5uZXIgYW5kXG4gICAgLy8gXCJNdWx0aXBsZSBlbnZpcm9ubWVudHNcIiB3YXJuaW5ncyBhcm91bmQgdGhlIHBheWxvYWQuXG4gICAgY29uc3QganNvblN0YXJ0ID0gcmV0LnN0ZG91dC5pbmRleE9mKCdbJyk7XG4gICAgY29uc3QganNvbkVuZCA9IHJldC5zdGRvdXQubGFzdEluZGV4T2YoJ10nKTtcbiAgICBpZiAoanNvblN0YXJ0ICE9PSAtMSAmJiBqc29uRW5kICE9PSAtMSAmJiBqc29uU3RhcnQgPCBqc29uRW5kKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJldC5zdGRvdXQuc2xpY2UoanNvblN0YXJ0LCBqc29uRW5kICsgMSkpIGFzIHsgbmFtZT86IHVua25vd24gfVtdO1xuICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLmZpbHRlcigobmFtZSk6IG5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRoZSB3YXJuaW5nIGJlbG93LlxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgvXFxbY29kZTogMTAwKDA3fDkwKVxcXXxJZiB0aGlzIGlzIGEgbmV3IFdvcmtlci8udGVzdChyZXQuc3Rkb3V0ICsgcmV0LnN0ZGVycikpIHtcbiAgICAvLyBUaGUgV29ya2VyIGRvZXMgbm90IGV4aXN0IHlldCwgc28gYSBmaXJzdCBkZXBsb3kgaW5oZXJpdHMgbm90aGluZy4gV3JhbmdsZXIgNC54IGNhdGNoZXNcbiAgICAvLyB0aGUgQ2xvdWRmbGFyZSBBUEkgZXJyb3JzIDEwMDA3ICh3b3JrZXJzLmFwaS5lcnJvci5zZXJ2aWNlX25vdF9mb3VuZCkgYW5kIDEwMDkwXG4gICAgLy8gKHdvcmtlcnMuYXBpLmVycm9yLnNjcmlwdF9ub3RfZm91bmQpIGFuZCByZXRocm93cyB0aGVtIGFzIGEgVXNlckVycm9yIGNvbnRhaW5pbmcgdGhlXG4gICAgLy8gJ0lmIHRoaXMgaXMgYSBuZXcgV29ya2VyLCBydW4gYHdyYW5nbGVyIGRlcGxveWAgZmlyc3QnIGhpbnQgd2l0aG91dCB0aGUgbnVtZXJpYyBjb2RlLFxuICAgIC8vIHNvIG1hdGNoIGJvdGggc2hhcGVzLlxuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYEZhaWxlZCB0byBsaXN0IHRoZSByZW1vdGUgV29ya2VyIHNlY3JldHM7IGNoZWNraW5nIG9ubHkgdGhlIGxvY2FsIHBheWxvYWQgYWdhaW5zdCBDbG91ZGZsYXJlJ3MgbGltaXRzLlxcbiR7KHJldC5zdGRlcnIgfHwgcmV0LnN0ZG91dCkudHJpbSgpfWBcbiAgICApXG4gICk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVtb3RlIHNlY3JldHMgdGhhdCBzdGF5IGF0dGFjaGVkIHRvIHRoZSBuZXcgdmVyc2lvbjogYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXNcbiAqIGFkZGl0aXZlLCBzbyBldmVyeSByZW1vdGUgc2VjcmV0IHRoZSBvdXRnb2luZyBwYXlsb2FkIGRvZXMgbm90IG92ZXJ3cml0ZSBrZWVwcyBjb3VudGluZ1xuICogYWdhaW5zdCBDbG91ZGZsYXJlJ3MgY29tYmluZWQgdmFyaWFibGUrc2VjcmV0IGxpbWl0IOKAlCBleGNlcHQgbmFtZXMgdGhhdCBhbiBlZmZlY3RpdmUgdmFyIG9yXG4gKiBiaW5kaW5nIHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5oZXJpdGVkUmVtb3RlU2VjcmV0TmFtZXMoXG4gIHJlbW90ZVNlY3JldE5hbWVzOiBzdHJpbmdbXSxcbiAgb3V0Z29pbmdTZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBlZmZlY3RpdmVWYXJLZXlzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYmluZGluZ05hbWVzOiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXBsYWNlZE5hbWVzID0gbmV3IFNldChbLi4uZWZmZWN0aXZlVmFyS2V5cywgLi4uYmluZGluZ05hbWVzXSk7XG4gIHJldHVybiByZW1vdGVTZWNyZXROYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFPYmplY3QuaGFzT3duKG91dGdvaW5nU2VjcmV0cywgbmFtZSkgJiYgIXJlcGxhY2VkTmFtZXMuaGFzKG5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZWFkaW5nIGJpbkV4aXN0cyBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBwcm9qZWN0LmVudi5QQVRILFxuICogc28gdGhlIGRpcmVjdCAobm9uLXNoZWxsKSB3cmFuZ2xlciBzcGF3bnMgcmVzb2x2ZSB0aGUgbG9jYWwgYmluYXJ5LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTG9jYWxCaW5QYXRoKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFwcm9qZWN0LmJpbkV4aXN0cykge1xuICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coJ25vZGVfbW9kdWxlcy8uYmluIG5vdCBmb3VuZDsgcmVseWluZyBvbiBQQVRIIHRvIHJlc29sdmUgd3JhbmdsZXIuJykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzLCByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmludGVyZmFjZSBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBDb21tYW5kRW52aXJvbm1lbnQge1xuICBjd2Q6IHN0cmluZztcbiAgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudjtcbn1cblxuY29uc3Qgc2h1dGRvd25TaWduYWxzID0gbmV3IFNldDxOb2RlSlMuU2lnbmFscz4oWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pO1xuXG5leHBvcnQgY29uc3QgZG90ZW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2RvdGVudiBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBmbm94IGFuZCBydW4gYSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcnVuUGFyc2VkRG90ZW52Q29tbWFuZChnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blBhcnNlZERvdGVudkNvbW1hbmQoeyBjb21tYW5kIH06IFBhcnNlZERvdGVudkFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudChjb21tYW5kLCAnd2IgZG90ZW52IC0tIDxjb21tYW5kPiBbYXJncy4uLl0nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoXG4gIGNvbW1hbmQ6IHN0cmluZ1tdLFxuICB1c2FnZTogc3RyaW5nLFxuICBjb21tYW5kRW52aXJvbm1lbnQ/OiBDb21tYW5kRW52aXJvbm1lbnRcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGBVc2FnZTogJHt1c2FnZX1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUoY29tbWFuZEVudmlyb25tZW50Py5jd2QgPz8gcHJvY2Vzcy5jd2QoKSk7XG4gIGNvbnN0IGVudiA9IGNvbW1hbmRFbnZpcm9ubWVudD8uZW52ID8/IHByb2Nlc3MuZW52O1xuICBpZiAoIWNvbW1hbmRFbnZpcm9ubWVudCkgcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkKTtcbiAgY29uc3QgYmVycnlCaW5Gb2xkZXJQYXRoID0gZW52LkJFUlJZX0JJTl9GT0xERVI7XG4gIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnYpO1xuICAvLyBTdHJpcHBpbmcgeWFybidzIGVudmlyb25tZW50IGFsc28gcmVtb3ZlcyBpdHMgdGVtcG9yYXJ5IGJpbiBmb2xkZXIg4oCUIHRoZSBPTkxZIHBsYWNlXG4gIC8vIHlhcm4gQmVycnkgZXhwb3NlcyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzIOKAlCBzbyByZXN0b3JlIHRoZSBwcm9qZWN0J3Mgb3duXG4gIC8vIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIGtlZXAgYmFyZSBiaW5hcnkgbmFtZXMgcmVzb2x2YWJsZS4gUGx1ZyduJ1BsYXkgaW5zdGFsbHNcbiAgLy8gY3JlYXRlIG5vIG5vZGVfbW9kdWxlcyBhdCBhbGw7IHRoZSB0ZW1wb3JhcnkgYmluIGZvbGRlciBpcyB0aGVuIHRoZSBzb2xlIHNvdXJjZSBvZlxuICAvLyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzLCBzbyByZXN0b3JlIGl0IGluc3RlYWQuXG4gIC8vIFRoZSB0ZW1wb3JhcnkgZm9sZGVyIGlzIGRlbGliZXJhdGVseSBOT1QgcmVzdG9yZWQgd2hlbiAuYmluIGRpcmVjdG9yaWVzIGV4aXN0OiBpdCBhbHNvXG4gIC8vIGNvbnRhaW5zIG5vZGUveWFybiBzaGltcywgYW5kIGEgbGVha2VkIG5vZGUgc2hpbSB3b3VsZCB2aW9sYXRlIHdiJ3MgcmVhbC1Ob2RlIGd1YXJhbnRlZVxuICAvLyBmb3IgdG9vbHMgbGlrZSB3cmFuZ2xlci92aW5leHQuIENoaWxkIGB5YXJuYCBpbnZvY2F0aW9ucyBzdGF5IHJlc29sdmFibGUgdGhyb3VnaCB0aGVcbiAgLy8gbGF1bmNoZXIgb24gdGhlIGJhc2UgUEFUSCAobWlzZS9jb3JlcGFjayksIHdoaWNoIGV2ZXJ5IHN1cHBvcnRlZCBlbnZpcm9ubWVudCBoYXMg4oCUXG4gIC8vIG5vdGhpbmcgY291bGQgaGF2ZSBzdGFydGVkIGB5YXJuIHJ1bmAvYHdiIGRvdGVudmAgd2l0aG91dCBpdC5cbiAgaWYgKCFwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoY3dkLCBlbnYpICYmIGJlcnJ5QmluRm9sZGVyUGF0aCkge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEggPyBgJHtiZXJyeUJpbkZvbGRlclBhdGh9OiR7ZW52LlBBVEh9YCA6IGJlcnJ5QmluRm9sZGVyUGF0aDtcbiAgfVxuXG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgICAgIH07XG4gICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIHByb2Nlc3Mub25jZShzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIH1cbiAgICBjaGlsZC5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgIC8vIFJlLXJhaXNlIGV2ZW4gZm9yIGZvcndhcmRlZCBzaHV0ZG93biBzaWduYWxzIHNvIGNhbGxlcnMgb2JzZXJ2ZSB0aGUgY29udmVudGlvbmFsXG4gICAgICAgIC8vIHNpZ25hbCBleGl0IHN0YXR1cyAoZS5nLiAxMzAgZm9yIFNJR0lOVCkgaW5zdGVhZCBvZiBhIG1pc2xlYWRpbmcgc3VjY2Vzcy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gY29kZSA/PyAxO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UpOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBbXG4gICAgICAuLi4oKGFyZ3YuYXJncyBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAgIC4uLigoYXJndlsnLS0nXSBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZml4VGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgICF2YWx1ZSB8fFxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyh2YWx1ZSkgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgPT09ICd0cnVlJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihcbiAgICBgV0JfRU5WIG11c3QgYmUgb25lIG9mIGRldmVsb3BtZW50LCB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kdWN0aW9uLCBidXQgaXMgXCIke3ZhbHVlfVwiLiBgICtcbiAgICAgIGBGaXggJHtmaXhUYXJnZXR9LCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suYFxuICApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbi8vIE5PVEU6IGB3YiBkb3RlbnZgIGRlbGliZXJhdGVseSBza2lwcyBQcm9qZWN0LmVudidzIGZ1bGwgdmFsaWRhdGlvbjogaXQgaXMgYSBnZW5lcmljIHJ1bm5lciBhbHNvXG4vLyB1c2VkIGJlZm9yZSBlbnYgc291cmNlcyBleGlzdCAoYm9vdHN0cmFwKSBhbmQgbXVzdCBub3QgZmFpbCBmYXN0IGZvciByZXBvc2l0b3JpZXMgdGhhdCBoYXZlIG5vdFxuLy8gYWRvcHRlZCB0aGUgb3JnIGVudiBzdGFuZGFyZC4gQSBOT04tRU1QVFkgV0JfRU5WIGlzIHN0aWxsIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzdGFuZGFyZCBtb2Rlcyxcbi8vIHRob3VnaCDigJQgYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gIHdvdWxkIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGJhc2UgKGRldmVsb3BtZW50KSB2YWx1ZXMuXG5mdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2Q6IHN0cmluZyk6IHZvaWQge1xuICAvLyBUaGUgbW9kZSBpcyBGT1JDRUQgb25seSB3aGVuIFdCX0VOViBpcyBleHBsaWNpdGx5IGV4cG9ydGVkOyBpdCBkcml2ZXMgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlXG4gIC8vIGJlbG93IGFuZCB0aGUgdmFsaWRhdGlvbiBhdCB0aGUgZW5kLlxuICBjb25zdCBtb2RlID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAvLyBUaGUgZm5veCBgLS1wcm9maWxlYCBzZWxlY3RvciwgZGVmYXVsdGluZyB0byBkZXZlbG9wbWVudCBsaWtlIHdiJ3MgbWFpbiBsb2FkZXIgKGBXQl9FTlYgfHxcbiAgLy8gTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J2AsIHNlZSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMpIHNvIGEgcmVwbyBrZWVwaW5nIGRldi1vbmx5IHNlY3JldHNcbiAgLy8gaW4gYFtwcm9maWxlcy5kZXZlbG9wbWVudC5zZWNyZXRzXWAgbG9hZHMgdGhlbSB3aGVuIFdCX0VOViBpcyB1bnNldCBpbnN0ZWFkIG9mIG9ubHkgdGhlIGJhc2VcbiAgLy8gdGFibGUuIEl0IGFkZGl0aW9uYWxseSBob25vcnMgYW4gZXhwbGljaXQgRk5PWF9QUk9GSUxFLCBiZWNhdXNlIGZub3ggaG9ub3JzIGl0IGFuZCBgd2IgZG90ZW52YFxuICAvLyB3aXRob3V0IFdCX0VOViBpcyBkb2N1bWVudGVkIHRvIGFzIHdlbGwgKHNlZSBydW5Gbm94RXhwb3J0J3MgaWdub3JlUHJvZmlsZUVudlZhciBub3RlKS5cbiAgLy8gTk9ERV9FTlYgaXMgcmVhZCB0aHJvdWdoIHRoZSBgcnVudGltZUVudmAgYWxpYXMsIG5ldmVyIGFzIHRoZSBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIG1lbWJlclxuICAvLyBleHByZXNzaW9uIHRoYXQgdGhlIGJ1bmRsZXIgaW5saW5lcyB0byAncHJvZHVjdGlvbicgKHdoaWNoIHdvdWxkIHdyb25nbHkgc2VsZWN0IHByb2R1Y3Rpb24pLlxuICBjb25zdCBydW50aW1lRW52ID0gcHJvY2Vzcy5lbnY7XG4gIGNvbnN0IGZub3hDYXNjYWRlID0gbW9kZSB8fCBydW50aW1lRW52LkZOT1hfUFJPRklMRSB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIC8vIFdCX0VOViBpbiBwcm9jZXNzLmVudiBtZWFucyB0aGUgbW9kZSBpcyBleHBsaWNpdGx5IGZvcmNlZCwgc28gdmFsdWVzIGZyb20gdGhlIG1vZGUncyBvd24gZm5veFxuICAvLyBwcm9maWxlIHdpbiBvdmVyIHZhcmlhYmxlcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IHNoZWxsIOKAlCBleGNlcHQgb24gQ0ksIHdoZXJlIGluamVjdGVkIGVudlxuICAvLyB2YXJzIG11c3Qga2VlcCBvdmVycmlkaW5nIGNvbW1pdHRlZCB2YWx1ZXNcbiAgLy8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85MzApLlxuICBjb25zdCBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgPSAhIW1vZGUgJiYgIWlzQ0kocHJvY2Vzcy5lbnYuQ0kpO1xuICBjb25zdCBbcGFyc2VkXSA9IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBmbm94Q2FzY2FkZSwgeyBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgfSk7XG4gIC8vIEV4cGFuZCAkey4uLn0gcmVmZXJlbmNlcyBhZ2FpbnN0IGV4cG9ydGVkIHZhcmlhYmxlcyB3aG9zZSBmbm94IHZhbHVlIGxvc2VzIHRvIHRoZSBzaGVsbFxuICAvLyAobWlycm9yaW5nIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcycgZWZmZWN0aXZlLXZhbHVlIHNlbWFudGljcyk6IGEgcmVmZXJlbmNlIG11c3QgcmVzb2x2ZSB0b1xuICAvLyB0aGUgdmFsdWUgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlLiByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzIHJldHVybnMgYVxuICAvLyBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgb25seSB3aGVuIHRoZSBmb3JjZWQgcHJvZmlsZSBvdmVycmlkZXMgaXQsIHNvIGV2ZXJ5IHBhcnNlZCBrZXkncyBvd25cbiAgLy8gdmFsdWUgd2lucyBhbmQgaXMgZXhjbHVkZWQgZnJvbSB0aGUgcmVmZXJlbmNlIHNldC5cbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZXhwb3J0ZWQgdmFsdWVzIHN1YnN0aXR1dGUgbGl0ZXJhbGx5IChwYSR3b3JkIHN0YXlzIHBhJHdvcmQpLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIHBhcnNlZCkpIHtcbiAgICAgIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gcGFyc2VkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgIC8vIEEgcHJvY2Vzcy5lbnYtc2hhZG93ZWQga2V5IHJlYWNoZXMgaGVyZSBvbmx5IHdoZW4gdGhlIGZvcmNlZCBwcm9maWxlIG92ZXJyaWRlcyBpdCAoc2VlXG4gICAgLy8gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyk7IG9uIENJIHN1Y2gga2V5cyBhcmUgbmV2ZXIgcmV0dXJuZWQsIHNvIG5vIGJyYW5jaCBpcyBuZWVkZWQuXG4gICAgaWYgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgV2FybmluZzogJHtrZXl9IGluIHRoZSBcIiR7bW9kZX1cIiBtb2RlJ3MgZW52IHNvdXJjZXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGVudmlyb25tZW50IGJlY2F1c2UgV0JfRU5WIGlzIGV4cGxpY2l0bHkgc2V0LmBcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8vIFZhbGlkYXRlIG9ubHkgQUZURVIgYXBwbHlpbmcgdGhlIHNvdXJjZXMsIHNvIGEgV0JfU0tJUF9FTlZfQ0hFQ0sgZGVmaW5lZCBpbiBhbiBlbnYgU09VUkNFIGlzXG4gIC8vIGhvbm9yZWQ6IGJvdGggdGhlIGNhcHR1cmVkIGV4cG9ydGVkIG1vZGUgKGl0IHNlbGVjdGVkIHRoZSBwcm9maWxlKSBhbmQgdGhlIEZJTkFMIHZhbHVlIHRoZVxuICAvLyBjaGlsZCB3aWxsIHNlZSDigJQgdGhlIGZub3ggcHJvZmlsZSBtYXkgZGVmaW5lIGEgYnJva2VuIFdCX0VOViAoZS5nLiBgcHJvZGN1dGlvbmApLCBhbmQgYSBmb3JjZWRcbiAgLy8gbW9kZSdzIHByb2ZpbGUgbWF5IGV2ZW4gb3ZlcnJpZGUgYSBWQUxJRCBleHBvcnRlZCB2YWx1ZS5cbiAgdmFsaWRhdGVTdGFuZGFyZFdiRW52KG1vZGUsICd0aGUgZXhwb3J0ZWQgdmFyaWFibGUnKTtcbiAgdmFsaWRhdGVTdGFuZGFyZFdiRW52KHByb2Nlc3MuZW52LldCX0VOViwgJ3RoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICAvLyBUaGUgc2VsZWN0ZWQgZW52aXJvbm1lbnQgaXMgd2hhdCBhbiBlbnYgc291cmNlIHNpbGVudGx5IHJlc29sdmluZyBXQl9FTlYgdG8gYSBESUZGRVJFTlQgdmFsdWVcbiAgLy8gbXVzdCBhZ3JlZSB3aXRoLCBlbHNlIHRoZSBjaGlsZCBydW5zIGxhYmVsZWQgb25lIGVudmlyb25tZW50IHdoaWxlIGNhcnJ5aW5nIGFub3RoZXIncyBzZWNyZXRzLlxuICAvLyBPbmx5IGEgU1RBTkRBUkQgY2FzY2FkZSBpcyBlbmZvcmNlZCAobWlycm9yaW5nIFByb2plY3QuY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52KTogYSBjdXN0b21cbiAgLy8gc2VsZWN0b3Igc3VjaCBhcyBgTk9ERV9FTlY9cWFgIGxlZ2l0aW1hdGVseSBzZWxlY3RzIHRoZSBgcWFgIHByb2ZpbGUgd2hpbGUgV0JfRU5WIHN0YXlzIGFcbiAgLy8gc3RhbmRhcmQgbW9kZS5cbiAgY29uc3QgZXhwZWN0ZWRDYXNjYWRlID0gZm5veENhc2NhZGU7XG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5XQl9FTlYgJiZcbiAgICBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10uaW5jbHVkZXMoZXhwZWN0ZWRDYXNjYWRlKSAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAhPT0gZXhwZWN0ZWRDYXNjYWRlICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICcxJyAmJlxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLICE9PSAndHJ1ZSdcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgcmVzb2x2ZXMgdG8gXCIke3Byb2Nlc3MuZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgRklMRV9TQ0hFTUEsIGdldEZpbGVEYXRhYmFzZVVybFBhdGggfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24gfSBmcm9tICcuL2xpdGVzdHJlYW0uanMnO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXRNb3VudERpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIEJsaXR6IHNlZWQgbW9kdWxlcyBkZWZhdWx0LWV4cG9ydCB0aGUgc2VlZCBmdW5jdGlvbiB3aXRob3V0IGNhbGxpbmcgaXQsIHNvIG9ubHlcbiAgICAvLyBgYmxpdHogZGIgc2VlZGAgKHdob3NlIGxvYWRlciBpbnZva2VzIHRoZSBleHBvcnQpIGFjdHVhbGx5IHBvcHVsYXRlcyB0aGUgZGF0YWJhc2UuXG4gICAgLy8gQnVuLWVyYSBCbGl0eiByZXBvc2l0b3JpZXMgZGVjbGFyZSBwcmlzbWEuc2VlZCBpbnN0ZWFkIGFuZCBtdXN0IGF2b2lkIHRoZSBibGl0eiBDTEksXG4gICAgLy8gd2hpY2ggcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbnNpZGUgQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZS5cbiAgICBpZiAoIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnYmxpdHonKSkge1xuICAgICAgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICB9XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIGNvbnN0IHNlZWRzUGF0aCA9IGAke3Byb2plY3QucHJpc21hRGlyTmFtZX0vc2VlZHMudHNgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcIiR7c2VlZHNQYXRofVwiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biAke3NlZWRzUGF0aH07IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuLyoqIFdoZXJlIHRoZSBMaXRlc3RyZWFtLXJlcGxpY2F0ZWQgU1FMaXRlIGRhdGFiYXNlIGlzIG1vdW50ZWQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldE1vdW50RGlyUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3Byb2plY3QucHJpc21hRGlyTmFtZX0vbW91bnRgO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhd0RiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIGFzIG5vcm1hbGl6ZVNoYXJlZEJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuLyoqXG4gKiBTdHJpcCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBgYnVuLmxvY2tgIGFuZCByZXBvcnQgYSBjaGFuZ2UuXG4gKlxuICogYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlIGNvbmZpZ3VyZWRcbiAqIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgbmFtZWQgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuICogdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbnkgaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgREVGQVVMVCByZWdpc3RyeSAoQ0ksIG9yIGFcbiAqIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG8gdGhlIGxvY2tmaWxlLCBhbmQgY29tbWl0dGluZ1xuICogdGhlbSBwaW5zIGEgU0hBUkVEIGxvY2tmaWxlIHRvIG9uZSBlbnZpcm9ubWVudCdzIG1pcnJvcjogZXZlcnkgbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaFxuICogdGhlIHByb3h5LCBhbmQgYSBjb2xkLWNhY2hlIGluc3RhbGwgZmFpbHMgb3V0cmlnaHQgd2l0aCA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGFcbiAqIHJlZ2lzdHJ5Lm5wbWpzLm9yZyB0b2tlbiwgYmVjYXVzZSBidW4gc2VuZHMgdGhlIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0XG4gKiB0aGUgbG9ja2ZpbGUgbmFtZXMuIEd1YXJkIGNvdmVyYWdlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1blxuICogZGVyaXZlcyB0aGUgZG93bmxvYWQgVVJMIGZyb20gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHRoZXkgYXJlIHB1cmUgZGFtYWdlLlxuICpcbiAqIHdiZnkgZ2VuZXJhdGVzIGEgcHJlLWNvbW1pdCBob29rIHRoYXQgc3RyaXBzIHRoZSBzYW1lIFVSTHMsIGJ1dCB0aGF0IG9ubHkgZmlyZXMgYXQgYGdpdCBjb21taXRgLlxuICogUnVubmluZyB0aGlzIHJpZ2h0IGFmdGVyIGFuIGluc3RhbGwgY2xvc2VzIHRoZSB3aW5kb3cgaW4gYmV0d2Vlbiwgd2hlcmUgdGhlIHJld3JpdHRlbiBsb2NrZmlsZSBpc1xuICogc2ltcGx5IHRoZSB3b3JraW5nIHRyZWUncyBzdGF0ZTogYSBieXBhc3NlZCBob29rLCBhIGNvbW1pdCBmcm9tIGEgdG9vbCB0aGF0IGRvZXMgbm90IHJ1biBob29rcyxcbiAqIG9yIGEgZGlmZiByZWFkIGJ5IGEgaHVtYW4gb3IgYW4gYWdlbnQgYWxsIHNlZSBpdC4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDsgYSBzY29wZWRcbiAqIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZShyb290RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm5veFNlY3JldHNUYWJsZSB7XG4gIFtrZXlOYW1lOiBzdHJpbmddOiB1bmtub3duO1xufVxuZXhwb3J0IGludGVyZmFjZSBGbm94Q29uZmlnIHtcbiAgcm9vdD86IHVua25vd247XG4gIGVudj86IHVua25vd247XG4gIGRlZmF1bHRfcHJvdmlkZXI/OiB1bmtub3duO1xuICBpbXBvcnQ/OiB1bmtub3duO1xuICBzZWNyZXRzPzogRm5veFNlY3JldHNUYWJsZTtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBGbm94U2VjcmV0c1RhYmxlIH0gfCB1bmRlZmluZWQ+O1xufVxuXG4vKipcbiAqIEV2ZXJ5IGBmbm94LnRvbWxgIGZyb20gYHByb2plY3REaXJQYXRoYCB1cCB0byAoYW5kIGluY2x1ZGluZykgYHJvb3REaXJQYXRoYCwgbmVhcmVzdCBmaXJzdC5cbiAqIEEgY29uZmlnIGRlY2xhcmluZyBmbm94J3MgYHJvb3QgPSB0cnVlYCBjaGFpbiBib3VuZGFyeSBlbmRzIHRoZSB3YWxrLCBtYXRjaGluZyBmbm94IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWdQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpO1xuICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbmZpZ1BhdGhzLnB1c2goY29uZmlnUGF0aCk7XG4gICAgICBpZiAocGFyc2VGbm94Q29uZmlnKGNvbmZpZ1BhdGgpLnJvb3QgPT09IHRydWUpIGJyZWFrO1xuICAgIH1cbiAgICAvLyBTdG9wIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QgKGl0cyBwYXJlbnQncyBzZWNyZXRzIGFyZSBub3QgcGFydCBvZiB0aGlzIHJlcG8pIG9yLCBkZWZlbnNpdmVseSxcbiAgICAvLyBhdCB0aGUgZmlsZXN5c3RlbSByb290IHdoZW4gcm9vdERpclBhdGggaXMgbm90IGFjdHVhbGx5IGFuIGFuY2VzdG9yLlxuICAgIGlmIChkaXJQYXRoID09PSByb290UGF0aCB8fCBwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICB9XG4gIHJldHVybiBjb25maWdQYXRocztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRm5veENvbmZpZyhjb25maWdQYXRoOiBzdHJpbmcpOiBGbm94Q29uZmlnIHtcbiAgcmV0dXJuIHBhcnNlVG9tbChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSkgYXMgRm5veENvbmZpZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB2YWx1ZXMgdGhhdCBhcmUgc2FmZSB0byBiYWtlIGludG8gYSBEb2NrZXIgaW1hZ2U6IG9ubHkgZW50cmllcyB3aG9zZSBFRkZFQ1RJVkVcbiAqIGRlZmluaXRpb24gKGJhc2UgYFtzZWNyZXRzXWAgb3ZlcmxhaWQgYnkgYFtwcm9maWxlcy48cHJvZmlsZU5hbWU+LnNlY3JldHNdYCwgYW5jZXN0b3IgY29uZmlnc1xuICogb3ZlcmxhaWQgYnkgbmVhcmVyIG9uZXMg4oCUIGZub3gncyBvd24gcHJlY2VkZW5jZSkgaXMgYSBwbGFpbnRleHQgYHsgZGVmYXVsdCA9IFwiLi4uXCIgfWAgd2l0aG91dCBhXG4gKiBwcm92aWRlci4gU2VjcmV0cyBuZXZlciBhcHBlYXIgaW4gdGhlIHJlc3VsdCwgZXZlbiB3aGVuIGEgcGxhaW50ZXh0IGJhc2UgdmFsdWUgaXMgb3ZlcnJpZGRlbiBieVxuICogYW4gZW5jcnlwdGVkIHByb2ZpbGUgdmFsdWUgKG9yIHZpY2UgdmVyc2E6IGEgcHJvZmlsZSBwbGFpbnRleHQgb3ZlcnJpZGUgb2YgYW4gZW5jcnlwdGVkIGJhc2UgSVNcbiAqIHJldHVybmVkLCBiZWNhdXNlIHRoZSBlZmZlY3RpdmUgZW50cnkgaXMgcGxhaW50ZXh0KS4gTmVlZHMgbm8gYWdlIGtleSBhbmQgbmV2ZXIgZGVjcnlwdHMuXG4gKlxuICogT25seSB0aGUgY2Fub25pY2FsIHdiZnkgZm5veC50b21sIGxheW91dCBpcyBzdXBwb3J0ZWQ6IGZub3ggc2V0dGluZ3MgdGhhdCB3b3VsZCBjaGFuZ2Ugd2hhdFxuICogYGZub3ggZXhwb3J0YCB5aWVsZHMgcmVsYXRpdmUgdG8gdGhpcyBzdGF0aWMgcmVhZGluZyAoYSB0b3AtbGV2ZWwgYGVudmAgb3IgYGRlZmF1bHRfcHJvdmlkZXJgLFxuICogYGltcG9ydGAsIG9yIGEgdmFsdWUgdHJhbnNmb3JtYXRpb24gc3VjaCBhcyBganNvbl9wYXRoYC9gbGluZWAvYGFzX2ZpbGVgKSBmYWlsIGZhc3QgaW5zdGVhZCBvZlxuICogc2lsZW50bHkgYmFraW5nIHZhbHVlcyBmbm94IHdvdWxkIG5vdCBleHBvcnQgYXMtaXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UGxhaW50ZXh0Rm5veFZhbHVlcyhcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJvZmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIC8vIFJvb3QtbW9zdCBmaXJzdCBzbyBuZWFyZXIgY29uZmlncyBvdmVybGF5IGFuY2VzdG9yIHZhbHVlczsgdGhlIHByb2ZpbGUgdGFibGUgYWx3YXlzIG92ZXJsYXlzXG4gIC8vIHRoZSBiYXNlIHRhYmxlLCBtYXRjaGluZyBmbm94J3MgcHJvZmlsZSByZXNvbHV0aW9uLlxuICBjb25zdCBjb25maWdQYXRocyA9IGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aCwgcm9vdERpclBhdGgpLnRvUmV2ZXJzZWQoKTtcbiAgY29uc3QgY29uZmlncyA9IGNvbmZpZ1BhdGhzLm1hcCgoY29uZmlnUGF0aCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlRm5veENvbmZpZyhjb25maWdQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHNldHRpbmdOYW1lIG9mIFsnZGVmYXVsdF9wcm92aWRlcicsICdlbnYnLCAnaW1wb3J0J10gYXMgY29uc3QpIHtcbiAgICAgIGlmIChjb25maWdbc2V0dGluZ05hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2NvbmZpZ1BhdGh9IHVzZXMgdGhlIHRvcC1sZXZlbCAke3NldHRpbmdOYW1lfSBzZXR0aW5nLCB3aGljaCBpcyBvdXRzaWRlIHRoZSBjYW5vbmljYWwgd2JmeSBmbm94LnRvbWwgbGF5b3V0OyByZW1vdmUgaXQgb3Iga2VlcCBzdWNoIHZhbHVlcyBvdXQgb2YgdGhlIERvY2tlciBiYWtlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSk7XG4gIC8vIE51bGwtcHJvdG90eXBlIHJlY29yZHM6IGZub3ggYWNjZXB0cyBgX19wcm90b19fYCBhcyBhbiBvcmRpbmFyeSBrZXksIGFuZCBPYmplY3QuYXNzaWduIG9uIGFcbiAgLy8gZGVmYXVsdC1wcm90b3R5cGUgb2JqZWN0IHdvdWxkIHRyZWF0IGl0IGFzIHRoZSBsZWdhY3kgcHJvdG90eXBlIHNldHRlciBhbmQgZHJvcCB0aGUgZW50cnkuXG4gIGNvbnN0IGVmZmVjdGl2ZUVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gT2JqZWN0LmNyZWF0ZShudWxsKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykgT2JqZWN0LmFzc2lnbihlZmZlY3RpdmVFbnRyaWVzLCBjb25maWcuc2VjcmV0cyk7XG4gIGlmIChwcm9maWxlTmFtZSkge1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIE9iamVjdC5hc3NpZ24oZWZmZWN0aXZlRW50cmllcywgY29uZmlnLnByb2ZpbGVzPy5bcHJvZmlsZU5hbWVdPy5zZWNyZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IE9iamVjdC5jcmVhdGUobnVsbCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZm9yIChjb25zdCBba2V5TmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVmZmVjdGl2ZUVudHJpZXMpKSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ29iamVjdCcgfHwgZW50cnkgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHtcbiAgICAgIGFzX2ZpbGUsXG4gICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsXG4gICAgICBlbnYsXG4gICAgICBqc29uX3BhdGgsXG4gICAgICBsaW5lLFxuICAgICAgcHJvdmlkZXIsXG4gICAgICB2YWx1ZSxcbiAgICB9ID0gZW50cnkgYXMge1xuICAgICAgYXNfZmlsZT86IHVua25vd247XG4gICAgICBkZWZhdWx0PzogdW5rbm93bjtcbiAgICAgIGVudj86IHVua25vd247XG4gICAgICBqc29uX3BhdGg/OiB1bmtub3duO1xuICAgICAgbGluZT86IHVua25vd247XG4gICAgICBwcm92aWRlcj86IHVua25vd247XG4gICAgICB2YWx1ZT86IHVua25vd247XG4gICAgfTtcbiAgICAvLyBTa2lwIGVudHJpZXMgZm5veCBkb2VzIG5vdCBleHBvcnQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBtYXRjaGluZyBgZm5veCBleHBvcnRgJ3MgZGVmYXVsdC5cbiAgICBpZiAoZW52ID09PSBmYWxzZSB8fCBlbnYgPT09ICdleGVjJykgY29udGludWU7XG4gICAgLy8gQSBgdmFsdWVgIG1hcmtzIGEgcHJvdmlkZXItYmFja2VkIChlbmNyeXB0ZWQpIGVudHJ5IGV2ZW4gaW4gZXhvdGljIGNvbmZpZ3M7IG5ldmVyIGJha2UgaXQuXG4gICAgaWYgKHByb3ZpZGVyICE9PSB1bmRlZmluZWQgfHwgdmFsdWUgIT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBpZiAoanNvbl9wYXRoICE9PSB1bmRlZmluZWQgfHwgbGluZSAhPT0gdW5kZWZpbmVkIHx8IGFzX2ZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGVudHJ5ICR7a2V5TmFtZX0gdXNlcyBhIGZub3ggdmFsdWUgdHJhbnNmb3JtYXRpb24gKGpzb25fcGF0aC9saW5lL2FzX2ZpbGUpLCBzbyBpdHMgZXhwb3J0ZWQgdmFsdWUgZGlmZmVycyBmcm9tIGl0cyByYXcgZGVmYXVsdDsga2VlcCBzdWNoIHZhbHVlcyBvdXQgb2YgdGhlIERvY2tlciBiYWtlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHZhbHVlc1trZXlOYW1lXSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZVBsYWludGV4dFJlZmVyZW5jZXModmFsdWVzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGAke05BTUV9YCByZWZlcmVuY2VzIGJldHdlZW4gcGxhaW50ZXh0IHZhbHVlcyB0aGUgd2F5IGZub3gncyBvd24gZXhwb3J0IGRvZXMgKHdiZnlcbiAqIGV4cGxpY2l0bHkgdG9sZXJhdGVzIGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOViA9IFwiJHtXQl9FTlZ9XCJgKS4gQSByZWZlcmVuY2UgdG8gYW55dGhpbmcgdGhhdCBpc1xuICogbm90IGl0c2VsZiBhIGJha2VhYmxlIHBsYWludGV4dCBlbnRyeSDigJQgYSBzZWNyZXQsIGFuIHVuZGVjbGFyZWQga2V5LCBvciBhIGN5Y2xlIOKAlCBmYWlscyBmYXN0OlxuICogcmVzb2x2aW5nIGl0IHdvdWxkIGVpdGhlciByZXF1aXJlIGRlY3J5cHRpb24gb3IgZGl2ZXJnZSBmcm9tIGBmbm94IGV4cG9ydGAuIEJhcmUgYCROQU1FYCBzdGF5c1xuICogdW50b3VjaGVkLCBtYXRjaGluZyBmbm94LCBhbmQgaXMgcmVqZWN0ZWQgbGF0ZXIgYnkgdGhlIHNlcmlhbGl6ZXIgYmVjYXVzZSBkb3RlbnYtZXhwYW5kLXN0eWxlXG4gKiBjb25zdW1lcnMgd291bGQgcmVzb2x2ZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVBsYWludGV4dFJlZmVyZW5jZXModmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc29sdmVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gT2JqZWN0LmNyZWF0ZShudWxsKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZXNvbHZlID0gKGtleU5hbWU6IHN0cmluZywgcmF3VmFsdWU6IHN0cmluZywgc3RhY2s6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSByZXNvbHZlZFZhbHVlc1trZXlOYW1lXTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgaWYgKHN0YWNrLmluY2x1ZGVzKGtleU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBlbnRyaWVzICR7Wy4uLnN0YWNrLCBrZXlOYW1lXS5qb2luKCcgLT4gJyl9IGZvcm0gYSByZWZlcmVuY2UgY3ljbGUgaW4gZm5veC50b21sLmApO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZCA9IHJhd1ZhbHVlLnJlcGxhY2VBbGwoL1xcJFxceyhbQS1aYS16X11cXHcqKVxcfS9nLCAoXywgcmVmZXJlbmNlZEtleU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlZFJhd1ZhbHVlID0gdmFsdWVzW3JlZmVyZW5jZWRLZXlOYW1lXTtcbiAgICAgIGlmIChyZWZlcmVuY2VkUmF3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSB2YWx1ZSBvZiAke2tleU5hbWV9IHJlZmVyZW5jZXMgJHtyZWZlcmVuY2VkS2V5TmFtZX0sIHdoaWNoIGlzIG5vdCBhIGJha2VhYmxlIHBsYWludGV4dCBmbm94IGVudHJ5OyBvbmx5IHBsYWludGV4dC10by1wbGFpbnRleHQgcmVmZXJlbmNlcyBjYW4gYmUgYmFrZWQgaW50byBhIERvY2tlciBpbWFnZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZShyZWZlcmVuY2VkS2V5TmFtZSwgcmVmZXJlbmNlZFJhd1ZhbHVlLCBbLi4uc3RhY2ssIGtleU5hbWVdKTtcbiAgICB9KTtcbiAgICByZXNvbHZlZFZhbHVlc1trZXlOYW1lXSA9IHJlc29sdmVkO1xuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfTtcbiAgZm9yIChjb25zdCBba2V5TmFtZSwgcmF3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlcykpIHJlc29sdmUoa2V5TmFtZSwgcmF3VmFsdWUsIFtdKTtcbiAgcmV0dXJuIHJlc29sdmVkVmFsdWVzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHR5cGUgeyBGbm94U2VjcmV0c1RhYmxlIH0gZnJvbSAnLi9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBmaW5kQW5jZXN0b3JGbm94Q29uZmlnUGF0aHMsIHBhcnNlRm5veENvbmZpZyB9IGZyb20gJy4vZm5veFRvbWwuanMnO1xuXG4vKipcbiAqIFdyaXRlIHRoZSBrZXktb25seSBzdHViIHRoYXQgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHJlYWRzIHRvIHR5cGUgdGhlIENsb3VkZmxhcmUgYEVudmAuXG4gKlxuICogYHdyYW5nbGVyIHR5cGVzYCBkZXJpdmVzIGVhY2ggYEVudmAgbWVtYmVyIGZyb20gYSBrZXkncyBtZXJlIHByZXNlbmNlIGluIHRoZSBmaWxlIOKAlCBuZXZlciBmcm9tIGl0c1xuICogdmFsdWUsIGFuZCBuZXZlciBmcm9tIHByb2Nlc3MuZW52IOKAlCBhbmQgYC0tZW52LWZpbGVgIFJFUExBQ0VTIHdyYW5nbGVyJ3MgbmF0aXZlIGAuZW52YC9gLmRldi52YXJzYFxuICogcmVhZGluZy4gVGhlIHN0dWIgdGhlcmVmb3JlIGNhcnJpZXMgZXZlcnkgZGVjbGFyZWQgYmluZGluZyBrZXkgd2l0aCBhIGNvbnN0YW50IHBsYWNlaG9sZGVyIHZhbHVlXG4gKiAoYDFgLCBub3QgZW1wdHksIHNvIGl0IGNhbm5vdCBvdmVycmlkZSBhIHdyYW5nbGVyIGB2YXJzYCBiaW5kaW5nIHdpdGggYW4gZW1wdHkgc3RyaW5nKS4gSXQgd3JpdGVzIG5vXG4gKiByZWFsIHNlY3JldCBhbmQgbmVlZHMgbm8gZGVjcnlwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKHByb2plY3REaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBrZXlOYW1lcyA9IGNvbGxlY3RXb3JrZXJCaW5kaW5nS2V5TmFtZXMocHJvamVjdERpclBhdGgsIHJvb3REaXJQYXRoKTtcbiAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgb3V0cHV0UGF0aCxcbiAgICBrZXlOYW1lcy5tYXAoKGtleU5hbWUpID0+IGAke2tleU5hbWV9PTFgKS5qb2luKCdcXG4nKSArIChrZXlOYW1lcy5sZW5ndGggPiAwID8gJ1xcbicgOiAnJylcbiAgKTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgJHtvdXRwdXRQYXRofSB3aXRoICR7a2V5TmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcy5gKSk7XG59XG5cbi8qKlxuICogQ29sbGVjdCB0aGUgZGVjbGFyZWQgV29ya2VyIGJpbmRpbmcga2V5IE5BTUVTIGZyb20gdGhlIGNvbW1pdHRlZCBgZm5veC50b21sYCBmaWxlcyB3aXRob3V0XG4gKiBkZWNyeXB0aW5nIGFueXRoaW5nIG9yIGludm9raW5nIHRoZSBlbnZpcm9ubWVudCByZWFkZXIuIFRoaXMgZGVsaWJlcmF0ZWx5IGF2b2lkcyBwcm9jZXNzLmVudixcbiAqIGBtaXNlIGVudmAgaG9zdC90b29sIHZhcmlhYmxlcywgYW5kIGNhc2NhZGUvcHJvZmlsZSBzZWxlY3Rpb24sIGFsbCBvZiB3aGljaCB3b3VsZCBvdGhlcndpc2VcbiAqIHBvbGx1dGUgb3IgbmFycm93IHRoZSBnZW5lcmF0ZWQgYEVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0V29ya2VyQmluZGluZ0tleU5hbWVzKHByb2plY3REaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIGZub3ggbWVyZ2VzIHRoZSB3aG9sZSBhbmNlc3RvciBjb25maWcgY2hhaW4gKGEgbmVzdGVkIFdvcmtlciBpbmhlcml0cyB0aGUgbW9ub3JlcG8gcm9vdCdzXG4gIC8vIHNlY3JldHMpLCBzbyB1bmlvbiBldmVyeSBmbm94LnRvbWwgZnJvbSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgdXAgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgZm9yIChjb25zdCBjb25maWdQYXRoIG9mIGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgZm9yIChjb25zdCBrZXlOYW1lIG9mIHBhcnNlRm5veFNlY3JldEtleU5hbWVzKGNvbmZpZ1BhdGgpKSBrZXlOYW1lcy5hZGQoa2V5TmFtZSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5rZXlOYW1lc10udG9Tb3J0ZWQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGtleSBuYW1lcyB1bmRlciBgZm5veC50b21sYCdzIGBbc2VjcmV0c11gIGFuZCBldmVyeSBgW3Byb2ZpbGVzLjxuYW1lPi5zZWNyZXRzXWAgdGFibGUuXG4gKiBmbm94IHN0b3JlcyBrZXkgbmFtZXMgaW4gcGxhaW50ZXh0IChvbmx5IHZhbHVlcyBhcmUgZW5jcnlwdGVkKSwgc28gdGhpcyBuZWVkcyBubyBhZ2Uga2V5LiBFdmVyeVxuICogcHJvZmlsZSdzIHNlY3JldHMgYXJlIHVuaW9uZWQgc28gdGhlIEVudiBpcyBhIGRldGVybWluaXN0aWMgc3VwZXJzZXQgY292ZXJpbmcgYWxsIGVudmlyb25tZW50c1xuICogKGxpa2UgdGhlIGZvcm1lciBjb21taXR0ZWQgLmVudi5leGFtcGxlKSwgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2ZpbGUgYSBnaXZlbiBydW4gcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRm5veFNlY3JldEtleU5hbWVzKGNvbmZpZ1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VGbm94Q29uZmlnKGNvbmZpZ1BhdGgpO1xuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY29sbGVjdCA9IChzZWNyZXRzOiBGbm94U2VjcmV0c1RhYmxlIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5TmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMgPz8ge30pKSB7XG4gICAgICAvLyBTa2lwIHNlY3JldHMgZm5veCBkb2VzIG5vdCBleHBvcnQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIChgZW52ID0gZmFsc2VgIC8gYFwiZXhlY1wiYCk6IHRoZXlcbiAgICAgIC8vIGFyZSBuZXZlciBXb3JrZXIgYmluZGluZ3MsIG1hdGNoaW5nIGBmbm94IGV4cG9ydGAncyBkZWZhdWx0LlxuICAgICAgY29uc3QgZW52ID0gdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiBlbnRyeSAhPT0gbnVsbCA/IChlbnRyeSBhcyB7IGVudj86IHVua25vd24gfSkuZW52IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudiA9PT0gZmFsc2UgfHwgZW52ID09PSAnZXhlYycpIGNvbnRpbnVlO1xuICAgICAga2V5TmFtZXMucHVzaChrZXlOYW1lKTtcbiAgICB9XG4gIH07XG4gIGNvbGxlY3QoY29uZmlnLnNlY3JldHMpO1xuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgT2JqZWN0LnZhbHVlcyhjb25maWcucHJvZmlsZXMgPz8ge30pKSBjb2xsZWN0KHByb2ZpbGU/LnNlY3JldHMpO1xuICByZXR1cm4ga2V5TmFtZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5pbXBvcnQgeyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiB9IGZyb20gJy4uL3V0aWxzL3dvcmtlclR5cGVzRW52LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG4vLyBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgdGhlIENsb3VkZmxhcmUgYEVudmAncyBzZWNyZXQvdmFyIG1lbWJlcnMgb25seSBmcm9tIHRoZSBLRVkgTkFNRVMgaW4gYVxuLy8gLmRldi52YXJzLy5lbnYgZmlsZSAobmV2ZXIgZnJvbSBwcm9jZXNzLmVudiksIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgdGhhdCBkZWZhdWx0IGZpbGUgc2V0LiBTb1xuLy8gZ2VuLWNvZGUgdHlwZXMgYSBXb3JrZXIgYWdhaW5zdCBhIHRocm93YXdheSBrZXktb25seSBzdHViIHdyaXR0ZW4gaGVyZSBmcm9tIGNvbW1pdHRlZCBzb3VyY2VzLlxuY29uc3Qgd29ya2VyVHlwZXNFbnZQYXRoID0gcGF0aC5qb2luKCcud3JhbmdsZXInLCAnd29ya2VyLXR5cGVzLmVudicpO1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHRoZSBlYXJseSByZXR1cm4gYmVsb3c6IGBnZW4tY29kZWAgaXMgdGhlIGBwb3N0aW5zdGFsbGAgc2NyaXB0IHdiZnkgZ2VuZXJhdGVzLCBtYWtpbmdcbiAgICAvLyB0aGlzIHRoZSBmaXJzdCB3YiBjb2RlIHRoYXQgcnVucyBhZnRlciBidW4gbWF5IGhhdmUgcmV3cml0dGVuIHRoZSBsb2NrZmlsZSwgYW5kIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGggbm90aGluZyB0byBnZW5lcmF0ZSBuZWVkcyB0aGUgbm9ybWFsaXphdGlvbiBqdXN0IGFzIG11Y2guIGByb290RGlyUGF0aGAgcmF0aGVyIHRoYW5cbiAgICAvLyBgcHJvamVjdHMucm9vdC5kaXJQYXRoYDogYnVuIHJ1bnMgYSB3b3Jrc3BhY2UgcGFja2FnZSdzIHBvc3RpbnN0YWxsIGZyb20gdGhhdCBwYWNrYWdlJ3NcbiAgICAvLyBkaXJlY3RvcnksIGFuZCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyBvbmx5IGNsaW1icyBvdXQgb2YgYHBhY2thZ2VzLypgLCBzbyBhIHdvcmtzcGFjZSBzdWNoXG4gICAgLy8gYXMgYGFwcHMvd2ViYCB3b3VsZCBvdGhlcndpc2UgbG9vayBmb3IgYGFwcHMvd2ViL2J1bi5sb2NrYCBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5J3MuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdHMuc2VsZi5yb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICAvLyBXcml0ZSB0aGUga2V5IHN0dWIgdGhlIGZpcnN0IHNjcmlwdCdzIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCBjb25zdW1lcy4gSXQgaXMgZGVyaXZlZCBmcm9tXG4gICAgICAvLyBjb21taXR0ZWQgc291cmNlcyAoZm5veC50b21sIGtleSBuYW1lcyksIHNvIGl0IG5lZWRzIG5vIGFnZSBrZXksIG5ldmVyIHB1bGxzIGluXG4gICAgICAvLyBwcm9jZXNzLmVudiAvIGBtaXNlIGVudmAgaG9zdCB2YXJpYWJsZXMsIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggcHJvZmlsZSBhIHJ1biByZXNvbHZlcy5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KSkge1xuICAgICAgICB3cml0ZVdvcmtlclR5cGVzRW52U3R1YihcbiAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgcHJvamVjdC5yb290RGlyUGF0aCxcbiAgICAgICAgICBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCB3b3JrZXJUeXBlc0VudlBhdGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICAvLyBGaXJzdDogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGlzIGdpdGlnbm9yZWQsIHNvIG9uIGEgZnJlc2ggY2hlY2tvdXQgaXQgZG9lcyBub3QgZXhpc3QgeWV0LFxuICAvLyBhbmQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgdHlwZS1jaGVjayBhZ2FpbnN0IHRoZSBDbG91ZGZsYXJlIGBFbnZgIGl0IGRlY2xhcmVzLlxuICBjb25zdCB3cmFuZ2xlclR5cGVzU2NyaXB0ID0gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHdyYW5nbGVyVHlwZXNTY3JpcHQpIHtcbiAgICAvLyBgLS1lbnYtZmlsZWAgcG9pbnRzIHdyYW5nbGVyIGF0IHRoZSBrZXkgc3R1YiB0aGUgaGFuZGxlciB3cml0ZXMgKHNlZSB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksXG4gICAgLy8gc28gYSBmcmVzaCBjaGVja291dCB3aXRoIG5vIHJ1bnRpbWUgLmRldi52YXJzIChlLmcuIENJKSBzdGlsbCB0eXBlcyBldmVyeSBzZWNyZXQuIFdpdGhvdXQgaXQgYVxuICAgIC8vIGJhcmUgYHdyYW5nbGVyIHR5cGVzYCB5aWVsZHMgYW4gYEVudmAgbWlzc2luZyBldmVyeSBzZWNyZXQgYW5kIHRoZSB0eXBlLWF3YXJlIGdlbmVyYXRvcnMvbGludGVyc1xuICAgIC8vIGJlbG93IGZhaWwgKGUuZy4gXCJQcm9wZXJ0eSAnQVVUSF9TRUNSRVQnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0VudidcIikuXG4gICAgc2NyaXB0cy5wdXNoKGAke3dyYW5nbGVyVHlwZXNTY3JpcHR9IC0tZW52LWZpbGUgJHt3b3JrZXJUeXBlc0VudlBhdGh9YCk7XG4gIH1cbiAgLy8gWWFybi1lcmEgQmxpdHogcmVwb3NpdG9yaWVzIG5lZWQgYGJsaXR6IGNvZGVnZW5gIGZvciB0aGUgcm91dGUgbWFuaWZlc3QgKG5vZGVfbW9kdWxlcy8uYmxpdHopXG4gIC8vIHRoYXQgQGJsaXR6anMvbmV4dCdzIHR5cGUgZGVjbGFyYXRpb25zIHJlLWV4cG9ydDsgaW5zdGFsbCBzY3JpcHRzIGRvIG5vdCBydW4gaXRcbiAgLy8gKGVuYWJsZVNjcmlwdHM6IGZhbHNlKS4gTmV2ZXIgdW5kZXIgQnVuOiB0aGUgYmxpdHogQ0xJIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW5cbiAgLy8gcGxhY2UsIHdoaWNoIG11c3Qgbm90IGhhcHBlbiBpbiBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlIChCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBnZW5lcmF0ZVxuICAvLyB0aGUgbWFuaWZlc3Qgd2l0aCB0aGVpciBvd24gc2NyaXB0cyBpbnN0ZWFkKS4gT24gYSBmcmVzaCBpbnN0YWxsIGBibGl0eiBjb2RlZ2VuYCBhbHNvXG4gIC8vIGdlbmVyYXRlcyB0aGUgUHJpc21hIGNsaWVudCBpdHNlbGYsIG1ha2luZyB0aGUgUFJJU01BIGdlbmVyYXRlIHN0ZXAgYmVsb3cgcmVkdW5kYW50IG9uY2Ug4oCUXG4gIC8vIGtlZXBpbmcgYm90aCBpcyBkZWxpYmVyYXRlOiBhZnRlciBzY2hlbWEtb25seSBjaGFuZ2VzIGJsaXR6J3MgYWxyZWFkeS1nZW5lcmF0ZWQgZ3VhcmQgc2tpcHNcbiAgLy8gaXRzIGludGVybmFsIGdlbmVyYXRlLCBzbyB0aGUgZXhwbGljaXQgc3RlcCBpcyBzdGlsbCB3aGF0IHJlZ2VuZXJhdGVzIHRoZSBjbGllbnQuXG4gIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gIH1cbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCk7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLyoqXG4gKiBgWUFSTiB3cmFuZ2xlcmAgcmF0aGVyIHRoYW4gYGJ1bnggd3JhbmdsZXJgOiB3cmFuZ2xlciBuZWVkcyByZWFsIE5vZGUuanMsIGFuZCBgYnVueGAgbWF5IHJlc29sdmVcbiAqIGEgdmVyc2lvbiBvdGhlciB0aGFuIHRoZSBsb2NrZmlsZSdzLiBSZXR1cm5zIHRoZSBiYXNlIGNvbW1hbmQ7IHRoZSBjYWxsZXIgYXBwZW5kcyBgLS1lbnYtZmlsZWBcbiAqIHBvaW50aW5nIGF0IGEgZ2VuZXJhdGVkIGtleS1vbmx5IHN0dWIgKHNlZSBnZXRHZW5Db2RlU2NyaXB0cykgYmVjYXVzZSBmbm94IHJlcG9zaXRvcmllcyBoYXZlIG5vXG4gKiBgLmVudmAgZmlsZSBmb3Igd3JhbmdsZXIgdG8gaW5mZXIgdGhlIHNlY3JldCBiaW5kaW5ncyBmcm9tLiBgLS1zdHJpY3QtdmFyc2AgaXMgZGVsaWJlcmF0ZWx5IGxlZnRcbiAqIG91dCDigJQgaXQgaXMgYSBwZXItcmVwb3NpdG9yeSB0eXBlLXN0cmljdG5lc3MgY2hvaWNlIHRoYXQgYmVsb25ncyBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLlxuICovXG5mdW5jdGlvbiBnZXRXcmFuZ2xlclR5cGVzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuZ2VuZXJhdGVzV29ya2VyVHlwZXMpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIHdyYW5nbGVyIHR5cGVzJztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcbiAgaWYgKCFmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkgcmV0dXJuO1xuICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0Jztcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSBmbm94IChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGVudmlyb25tZW50IHNvdXJjZXMgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSBmbm94IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS4gd2JmeSBkZWNsYXJlcyB0aGUgV0JfRU5WLWZhbWlseSBrZXlzIGluIGZub3gsIHNvXG4gICAgLy8gdGhleSBhcmUgYWxyZWFkeSBpbmNsdWRlZDsgcHJvY2Vzcy1vbmx5IGtleXMgYXJlIGludGVudGlvbmFsbHkgb3V0c2lkZSB0aGlzIGFsbG93bGlzdC5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBmbm94IHZhbHVlcyBmb3IgY29uZmlndXJlZCBrZXlzXG4gICAgLy8gKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmUgdGhlXG4gICAgLy8gc3RhbGUgY29uZmlndXJlZCB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBjb25maWd1cmVkIHZhbHVlIGlzIGRlbGliZXJhdGVcbiAgICAvLyBhbmQgbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzLCB3aGljaCBzdGF5XG4gICAgLy8gb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVzb2x2ZUNhc2NhZGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNvbGxlY3RQbGFpbnRleHRGbm94VmFsdWVzIH0gZnJvbSAnLi4vdXRpbHMvZm5veFRvbWwuanMnO1xuXG4vLyBBIERvY2tlciBpbWFnZSBtdXN0IGJha2Ugb25seSB2YWx1ZXMgdGhhdCBhcmUgc2FmZSB0byBwZXJzaXN0IGluIGxheWVycyBhbmQgcmVnaXN0cmllczogdGhlXG4vLyBwbGFpbnRleHQgYHsgZGVmYXVsdCA9IFwiLi4uXCIgfWAgZW50cmllcyBvZiBmbm94LnRvbWwuIEFnZS1lbmNyeXB0ZWQgc2VjcmV0cyBhcmUgcmVzb2x2ZWQgYXRcbi8vIHJ1bnRpbWUgZnJvbSB0aGUgZGVwbG95bWVudCBwbGF0Zm9ybSdzIHN0b3JlIGluc3RlYWQsIGFuZCB0aGUgYWdlIGtleSBuZXZlciBlbnRlcnMgYW4gaW1hZ2UuXG4vLyBUaGUgd2hvbGUgY29tbWFuZCB0aGVyZWZvcmUgd29ya3MgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCB0ZXh0IGFsb25lOiB0aGUgcHJvamVjdCBpc1xuLy8gbG9hZGVkIFdJVEhPVVQgaXRzIGVudmlyb25tZW50IChsb2FkaW5nIHdvdWxkIHNwYXduIGBmbm94IGV4cG9ydGAsIGkuZS4gZGVjcnlwdCBldmVyeSBzZWNyZXQpXG4vLyBhbmQgdGhlIHByb2ZpbGUgY29tZXMgZnJvbSB0aGUgc2hhcmVkIGNhc2NhZGUgcmVzb2x1dGlvbiwgbm90IGZyb20gbG9hZGVkIHNvdXJjZXMuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgR2VuRG9ja2VyRW52Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRG9ja2VyRW52Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8R2VuRG9ja2VyRW52Q29tbWFuZE9wdGlvbnMgJiB7IHBhdGg/OiBzdHJpbmcgfT47XG5cbmNvbnN0IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuZXhwb3J0IGNvbnN0IGdlbkRvY2tlckVudkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgR2VuRG9ja2VyRW52Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZ2VuLWRvY2tlci1lbnYgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRvY2tlci5lbnYgZmlsZSB0byBiYWtlIGludG8gYSBEb2NrZXIgaW1hZ2UsIGNvbnRhaW5pbmcgb25seSB0aGUgbm9uLXNlY3JldCAocGxhaW50ZXh0IGRlZmF1bHQpIHZhbHVlcyBvZiBmbm94LnRvbWwgZm9yIHRoZSBzZWxlY3RlZCBXQl9FTlYuIFNlY3JldHMgYXJlIG5ldmVyIHdyaXR0ZW47IGluamVjdCB0aGVtIGF0IHJ1bnRpbWUgZnJvbSB0aGUgZGVwbG95bWVudCBwbGF0Zm9ybS4gVGhlIGZpbGUgaXMgc2hlbGwtc291cmNlYWJsZSBkb3RlbnYgKGZvciBhIGJ1aWxkLXRpbWUgYHNldCAtYSAmJiAuIC4vLmRvY2tlci5lbnZgIGFuZCBkb3RlbnYgcGFyc2VycyksIG5vdCBmb3IgYGRvY2tlciAtLWVudi1maWxlYCwgd2hpY2gga2VlcHMgcXVvdGVzIGxpdGVyYWxseTsgcnVudGltZSBlbnRyeXBvaW50cyBtdXN0IGFwcGx5IGJha2VkIHZhbHVlcyBvbmx5IHRvIGtleXMgdGhlIHBsYXRmb3JtIGRpZCBub3QgYWxyZWFkeSBzZXQuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PlxuICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGgnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgLmRvY2tlci5lbnYgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRvY2tlci5lbnYnLFxuICAgIH0pIGFzIHVua25vd24gYXMgQXJndjxHZW5Eb2NrZXJFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogR2VuRG9ja2VyRW52Q29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2hhcmVkIGNhc2NhZGUgcmVzb2x1dGlvbiBrZWVwcyB0aGlzIGNvbW1hbmQncyBwcm9maWxlIGlkZW50aWNhbCB0byB0aGUgb25lIGV2ZXJ5IG90aGVyXG4gICAgLy8gd2IgY29tbWFuZCBsb2Fkcy4gQW4gdW5yZXNvbHZlZCBjYXNjYWRlICgtLWF1dG8tY2FzY2FkZS1lbnY9ZmFsc2Ugd2l0aG91dCAtLWNhc2NhZGUtZW52KSBvclxuICAgIC8vIGEgbm9uLXN0YW5kYXJkIG1vZGUgaXMgYSBoYXJkIGVycm9yOiBpdCB3b3VsZCBzaWxlbnRseSBiYWtlIHRoZSBiYXNlIChkZXZlbG9wbWVudCkgdmFsdWVzXG4gICAgLy8gaW50byBhIGRlcGxveSBhcnRpZmFjdC5cbiAgICBjb25zdCBlbnZOYW1lID0gcmVzb2x2ZUNhc2NhZGUoYXJndik7XG4gICAgaWYgKCFlbnZOYW1lKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ05vIGVudmlyb25tZW50IHNlbGVjdGVkOyBwYXNzIC0tY2FzY2FkZS1lbnY9PG1vZGU+IChvciBkcm9wIC0tYXV0by1jYXNjYWRlLWVudj1mYWxzZSkuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICghc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhlbnZOYW1lKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFdCX0VOViBtdXN0IGJlIG9uZSBvZiAke1suLi5zdGFuZGFyZFdiRW52TW9kZXNdLmpvaW4oJywgJyl9LCBidXQgaXMgJHtlbnZOYW1lfS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW52VmFycyA9IGNvbGxlY3RQbGFpbnRleHRGbm94VmFsdWVzKHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5yb290RGlyUGF0aCwgZW52TmFtZSk7XG4gICAgLy8gQSBXQl9FTlYtZmFtaWx5IGRlZmF1bHQgdGhhdCBkaXNhZ3JlZXMgd2l0aCB0aGUgc2VsZWN0ZWQgbW9kZSB3b3VsZCBsYWJlbCB0aGUgaW1hZ2Ugd2l0aCBhXG4gICAgLy8gZGlmZmVyZW50IChwb3NzaWJseSBtaXNzcGVsbGVkKSBlbnZpcm9ubWVudCB0aGFuIHRoZSBvbmUgd2hvc2UgdmFsdWVzIGl0IGJha2VzLlxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIFsnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVudlZhcnNbbWFya2VyXTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBlbnZOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKGBmbm94LnRvbWwgZGVmaW5lcyAke21hcmtlcn09JHt2YWx1ZX0gZm9yIHRoZSAke2Vudk5hbWV9IHByb2ZpbGU7IGFsaWduIGl0IHdpdGggdGhlIG1vZGUgbmFtZS5gKVxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENvZGUtcG9pbnQgb3JkZXIsIG5vdCBsb2NhbGVDb21wYXJlOiB0aGUgZmlsZSBtdXN0IGJlIGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyBidWlsZCBob3N0cyBzb1xuICAgIC8vIERvY2tlciBsYXllciBjYWNoaW5nIGFuZCBpbWFnZSByZXByb2R1Y2liaWxpdHkgYXJlIGxvY2FsZS1pbmRlcGVuZGVudC5cbiAgICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKGVudlZhcnMpXG4gICAgICAudG9Tb3J0ZWQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBzZXJpYWxpemVEb2NrZXJFbnZMaW5lKGtleSwgdmFsdWUpKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZG9ja2VyLmVudicpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IG5vbi1zZWNyZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzICgke2Vudk5hbWV9KS5gKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpO1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBub24tc2VjcmV0IGVudmlyb25tZW50IHZhcmlhYmxlcyAoJHtlbnZOYW1lfSkuYClcbiAgICApO1xuICB9LFxufTtcblxuLyoqXG4gKiBTZXJpYWxpemUgb25lIGAuZG9ja2VyLmVudmAgYXNzaWdubWVudCBzbyB0aGUgU0FNRSBieXRlcyBhcmUgcmVhZCBiYWNrIGJ5IGV2ZXJ5IGNhbm9uaWNhbFxuICogY29uc3VtZXI6IFBPU0lYIHNoZWxsIHNvdXJjaW5nIChgc2V0IC1hICYmIC4gLi8uZG9ja2VyLmVudmAgaW4gRG9ja2VyZmlsZXMgYW5kIGVudHJ5cG9pbnRzKSBhbmRcbiAqIGRvdGVudi1mYW1pbHkgcGFyc2Vycy4gU2luZ2xlIHF1b3RlcyBhcmUgdGhlIG9ubHkgcmVwcmVzZW50YXRpb24gYm90aCBmYW1pbGllcyB0cmVhdCBhcyBhXG4gKiBsaXRlcmFsIHNwYW4gKG5vIGV4cGFuc2lvbiwgbm8gY29tbWFuZCBzdWJzdGl0dXRpb24pLCBzbyB2YWx1ZXMgZm5veCB3b3VsZCBleHBhbmQgKGAkey4uLn1gXG4gKiByZWZlcmVuY2VzKSBvciB0aGF0IG5vIHNpbmdsZS1xdW90ZWQgc3BhbiBjYW4gaG9sZCAoYXBvc3Ryb3BoZXMsIG5ld2xpbmVzKSwgYW5kIGtleXMgdGhhdCBhcmVcbiAqIG5vdCBzaGVsbCBpZGVudGlmaWVycywgYXJlIHJlamVjdGVkIHdpdGggdGhlIG9mZmVuZGluZyBrZXkgaW5zdGVhZCBvZiBiZWluZyB3cml0dGVuIGluIGEgZm9ybVxuICogb25lIGNvbnN1bWVyIHdvdWxkIGNvcnJ1cHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVEb2NrZXJFbnZMaW5lKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCEvXltBLVphLXpfXVxcdyokLy50ZXN0KGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBrZXkgJHtrZXl9IGNhbm5vdCBiZSB3cml0dGVuIHRvIGEgLmRvY2tlci5lbnYgZmlsZTogaXQgaXMgbm90IGEgUE9TSVggc2hlbGwgaWRlbnRpZmllci5gKTtcbiAgfVxuICAvLyBgX19wcm90b19fYCBJUyBhIHZhbGlkIHNoZWxsIGlkZW50aWZpZXIsIGJ1dCBkb3RlbnYncyBwYXJzZXIgZHJvcHMgdGhlIGFzc2lnbm1lbnQgKHRoZSBsZWdhY3lcbiAgLy8gcHJvdG90eXBlIHNldHRlciBzd2FsbG93cyBpdCksIHNvIHRoZSBjb25zdW1lcnMgd291bGQgZGlzYWdyZWUgb24gdGhlIGtleSdzIHZlcnkgZXhpc3RlbmNlLlxuICBpZiAoa2V5ID09PSAnX19wcm90b19fJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUga2V5IF9fcHJvdG9fXyBjYW5ub3QgYmUgd3JpdHRlbiB0byBhIC5kb2NrZXIuZW52IGZpbGU6IGRvdGVudiBwYXJzZXJzIHNpbGVudGx5IGRyb3AgYSBfX3Byb3RvX18gYXNzaWdubWVudC5gXG4gICAgKTtcbiAgfVxuICAvLyBBIGJhcmUgYCROQU1FYCAod2hpY2ggZm5veCBleHBvcnRzIGxpdGVyYWxseSkgaXMgcmVzb2x2ZWQgYnkgZG90ZW52LWV4cGFuZC1zdHlsZSBjb25zdW1lcnNcbiAgLy8gd2hpbGUgc2hlbGwgc291cmNpbmcga2VlcHMgaXQgbGl0ZXJhbCwgZG90ZW52LWV4cGFuZCBhbHNvIHJld3JpdGVzIGBcXCRgIHRvIGAkYCwgYW5kIGEgcmVzaWR1YWxcbiAgLy8gYCR7YCBtYXJrcyBhIHJlZmVyZW5jZSBmb3JtIHRoZSBjb2xsZWN0b3IgY291bGQgbm90IHJlc29sdmUg4oCUIHNvIGFueSBleHBhbnNpb24tc2Vuc2l0aXZlIGAkYFxuICAvLyBtYWtlcyB0aGUgY29uc3VtZXJzIGRpc2FncmVlLiBgJGAgYmVmb3JlIGEgZGlnaXQsIHNwYWNlLCBgKGAsIG9yIHRoZSBlbmQgb2YgdGhlIHZhbHVlIGlzIGluZXJ0XG4gIC8vIGluIGJvdGggZmFtaWxpZXMgYW5kIHN0YXlzIHJlcHJlc2VudGFibGUuXG4gIGlmICgvXFwkW0EtWmEtel8ke118XFxcXFxcJC8udGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHZhbHVlIG9mICR7a2V5fSBjb250YWlucyBhbiBleHBhbnNpb24tc2Vuc2l0aXZlICQgcmVmZXJlbmNlOyB3YiBnZW4tZG9ja2VyLWVudiBkb2VzIG5vdCBleHBhbmQgcmVmZXJlbmNlcyDigJQgaW5saW5lIHRoZSB2YWx1ZSBpbiBmbm94LnRvbWwuYFxuICAgICk7XG4gIH1cbiAgLy8gQSB0cmFpbGluZyBiYWNrc2xhc2ggbWFrZXMgZG90ZW52J3MgcGFyc2VyIHJlYWQgdGhlIGNsb3NpbmcgcXVvdGUgYXMgYW4gZXNjYXBlZCBxdW90ZSBhbmRcbiAgLy8gc3dhbGxvdyB0aGUgZm9sbG93aW5nIGxpbmVzLCB3aGlsZSBzaGVsbCBzb3VyY2luZyByZWFkcyB0aGUgdmFsdWUgY29ycmVjdGx5LlxuICBpZiAoL1snXFxuXFxyXS8udGVzdCh2YWx1ZSkgfHwgdmFsdWUuZW5kc1dpdGgoJ1xcXFwnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSB3cml0dGVuIHRvIGEgLmRvY2tlci5lbnYgZmlsZTogYXBvc3Ryb3BoZXMsIG5ld2xpbmVzLCBhbmQgYSB0cmFpbGluZyBiYWNrc2xhc2ggYXJlIG5vdCByZXByZXNlbnRhYmxlIGluIGl0cyBzaW5nbGUtcXVvdGVkLCBzaGVsbC1zb3VyY2VhYmxlIGZvcm1hdC5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYCR7a2V5fT0nJHt2YWx1ZX0nYDtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlLCBvdXRwdXQpKSByZXR1cm47XG5cbiAgY29uc3Qgbm9ybWFsaXplZE91dHB1dCA9IG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dCk7XG4gIGlmIChub3JtYWxpemVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobm9ybWFsaXplZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBleGl0Q29kZSAhPT0gMCB8fCBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YXJuKD86aW5nKT9zP1xcYi9pLnRlc3Qob3V0cHV0LnJlcGxhY2VBbGwoL1xcYig/OjB8bm8pIHdhcm5pbmdzP1xcYi9naSwgJycpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCwgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBxdWlldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVwb3J0IGVycm9ycyBvbmx5JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJpbnQgb25seSBmYWlsZWQgb3Igd2FybmluZyBjb21tYW5kIG91dHB1dCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IHJ1c3RFeHRlbnNpb25zID0gbmV3IFNldChbJ3JzJ10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBzaG91bGRSdW5Gb3JtYXR0ZXJzID0gQm9vbGVhbihhcmd2LmZvcm1hdCk7XG4gIGNvbnN0IHNob3VsZFJ1bkxpbnRlcnMgPSAhYXJndi5mb3JtYXQgfHwgYXJndi5maXg7XG4gIC8vIFRoZSB0ZXN0IGxheW91dCBpcyBhIHN0YXRpYyBzdHJ1Y3R1cmFsIHJ1bGUsIHNvIGB3YiBsaW50YCBpcyBpdHMgaG9tZTogYHdiIHZlcmlmeWAgKHZpYSBpdHNcbiAgLy8gY2xlYW51cCBzdGVwKSBhbmQgQ0kncyBsaW50IGpvYiB0aGVuIGVuZm9yY2UgaXQgd2l0aCBubyBleHRyYSB3aXJpbmcsIGFuZCBhIHN0cmF5IHRlc3QgZmlsZVxuICAvLyBzdXJmYWNlcyBoZXJlIGluc3RlYWQgb2YgYXQgYHdiIHRlc3RgLCB3aGVyZSBgLS1wYXNzV2l0aE5vVGVzdHNgIHdvdWxkIG90aGVyd2lzZSBsZXQgdGhlIHN1aXRlXG4gIC8vIHBhc3Mgd2hpbGUgc2lsZW50bHkgcnVubmluZyBub25lIG9mIGl0LiBSZXBvcnRlZCBiZWZvcmUgdGhlIGxpbnRlcnMgcnVuIHNvIHRoZSBkaWFnbm9zaXMgbGVhZHNcbiAgLy8gdGhlIG91dHB1dCwgYnV0IG5ldmVyIHNob3J0LWNpcmN1aXRzIHRoZW06IGAtLWZpeCAtLWZvcm1hdGAgbXVzdCBzdGlsbCBjbGVhbiB1cCB3aGF0IGl0IGNhbixcbiAgLy8gYmVjYXVzZSBhIGxheW91dCB2aW9sYXRpb24gaXMgbm90IGF1dG8tZml4YWJsZSBhbmQgd291bGQgb3RoZXJ3aXNlIGJsb2NrIGV2ZXJ5IG90aGVyIGZpeC5cbiAgLy8gVGhyZWUgcnVuIHNoYXBlcyBvcHQgb3V0LiBFeHBsaWNpdC1wYXRoIHJ1bnMgKGUuZy4gdGhlIGxlZnRob29rIHByZS1jb21taXQgaG9vaykgc2tpcCBpdCBzbyBhXG4gIC8vIHByZS1leGlzdGluZyB2aW9sYXRpb24gaW4gYW4gdW50b3VjaGVkIHBhY2thZ2UgY2Fubm90IGJsb2NrIGFuIHVucmVsYXRlZCBjb21taXQuIGAtLWRyeS1ydW5gXG4gIC8vIHNraXBzIGl0IHNvIHRoaXMgc3RheXMgdGhlIG9uZSBzdGVwIHRoYXQgY291bGQgZmFpbCBhIHJ1biB3aG9zZSB3aG9sZSBjb250cmFjdCBpcyB0byBleGVjdXRlXG4gIC8vIG5vdGhpbmcuIEZvcm1hdHRlci1vbmx5IHJ1bnMgKGAtLWZvcm1hdGAgd2l0aG91dCBgLS1maXhgKSBza2lwIGl0IGJlY2F1c2UgdGhleSBsaW50IG5vdGhpbmcgYXRcbiAgLy8gYWxsLCBhbmQgd2JmeSBjaGFpbnMgdGhhdCBzY3JpcHQgYXMgYGJ1biB3YiBsaW50IC0tZm9ybWF0ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIGZvciBEYXJ0IGFuZFxuICAvLyBQeXRob24gcmVwb3NpdG9yaWVzIOKAlCBmYWlsaW5nIGl0IHRoZXJlIHdvdWxkIHNpbGVudGx5IHN0cmlwIHRoZWlyIG9ubHkgZm9ybWF0dGluZyBwYXNzLlxuICBjb25zdCB2aW9sYXRlc1Rlc3RTdHJ1Y3R1cmUgPVxuICAgIHNob3VsZFJ1bkxpbnRlcnMgJiYgIWFyZ3YuZHJ5UnVuICYmIGZpbGVzLmxlbmd0aCA9PT0gMCAmJiByZXBvcnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gIGNvbnN0IGxpbnRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGRhcnRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICAvLyBgY2FyZ28gZm10IC0tYWxsYCBhbHdheXMgZm9ybWF0cyB0aGUgd2hvbGUgd29ya3NwYWNlLCBzbyB3ZSB0cmFjayB0YXJnZXRcbiAgLy8gcHJvamVjdHMgcmF0aGVyIHRoYW4gaW5kaXZpZHVhbCBmaWxlIHBhdGhzLiBFdmVyeSBwcm9qZWN0IHdpdGggaXRzIG93blxuICAvLyBgQ2FyZ28udG9tbGAgcnVucyBpdHMgb3duIGBjYXJnbyBmbXQgLS1hbGxgOyB3ZSBpbnRlbnRpb25hbGx5IGRvIG5vdCBkZWR1cFxuICAvLyBieSBkaXJlY3RvcnkuIEEgbmVzdGVkIG9yIHNpYmxpbmcgY3JhdGUgY2FuIGJlIGFuIGluZGVwZW5kZW50IENhcmdvXG4gIC8vIHdvcmtzcGFjZSB0aGF0IGEgcGFyZW50J3MgYGNhcmdvIGZtdCAtLWFsbGAgbmV2ZXIgcmVhY2hlcywgc28gc2tpcHBpbmcgaXRcbiAgLy8gd291bGQgbGVhdmUgaXQgdW5mb3JtYXR0ZWQsIHdoaWxlIGFueSBnZW51aW5lbHkgb3ZlcmxhcHBpbmcgcnVucyBhcmVcbiAgLy8gaGFybWxlc3MgYmVjYXVzZSBydXN0Zm10IGlzIGRldGVybWluaXN0aWMgYW5kIGlkZW1wb3RlbnQuIERlZHVwaW5nIGJ5IHJlYWxcbiAgLy8gd29ya3NwYWNlIG1lbWJlcnNoaXAgd291bGQgcmVxdWlyZSBpbnZva2luZyBgY2FyZ28gbG9jYXRlLXByb2plY3RgLlxuICBjb25zdCBjYXJnb0Zvcm1hdFByb2plY3RzID0gbmV3IFNldDxQcm9qZWN0PigpO1xuICBjb25zdCBwcmV0dGllckZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzID0gZmFsc2U7XG4gIGxldCBwcmV0dGllckFyZ3M6IHN0cmluZ1tdO1xuICBsZXQgc29ydFBhY2thZ2VKc29uQXJnczogc3RyaW5nW107XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGludFRhcmdldHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKTtcbiAgICAgICAgY29uc3QgZmlsZUtpbmQgPSBhd2FpdCBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4geyBmaWxlS2luZCwgZmlsZVBhdGggfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZUtpbmQsIGZpbGVQYXRoIH0gb2YgbGludFRhcmdldHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaCguLi5nZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHsgbGludFBhdGgsIHByb2plY3QgfSBvZiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2sgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNvbnN0IHB5dGhvbkZpbGVQYXRocyA9IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNvbnN0IGRhcnRGaWxlUGF0aHMgPSBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGRhcnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0NhcmdvVG9tbCAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHJ1c3RFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNhcmdvRm9ybWF0UHJvamVjdHMuYWRkKHByb2plY3QpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb25zdCBsaW50RmlsZVBhdGhzID0gbGludEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGxpbnRQYXRoKSwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZvcm1hdHRlclBhdGggb2YgYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MocHJvamVjdCwgbGludFBhdGgsIGZpbGVLaW5kLCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFyZ3YuZm9ybWF0ICYmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10ICYmIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uKSAmJiAhcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTm8gbGludGVyIGZvdW5kIGZvciAke3Byb2plY3QubmFtZX0uIEluc3RhbGwgT3hsaW50LmApKTtcbiAgICAgICAgICBtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcmV0dGllckFyZ3MgPSBbLi4ubmV3IFNldChwcmV0dGllckZpbGVQYXRocyldO1xuICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBbLi4ubmV3IFNldChwYWNrYWdlSnNvbkZpbGVQYXRocyldO1xuICB9IGVsc2Uge1xuICAgIHByZXR0aWVyQXJncyA9IGJ1aWxkUHJldHRpZXJBcmdzKHByb2plY3RzLnNlbGYuZGlyUGF0aCwgcHJvamVjdHMuZGVzY2VuZGFudHMpO1xuICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IHAucGFja2FnZUpzb25QYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlckNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdID0gW107XG4gIGNvbnN0IGxpbnRlckNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdID0gW107XG4gIGNvbnN0IGxpbnRSdW5PcHRpb25zID0geyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBwcmVzZXJ2ZUNvbG9yOiAhYXJndi5wcmludEFsbE91dHB1dCB9IGFzIGNvbnN0O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgY2FyZ29Gb3JtYXRQcm9qZWN0cykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQob3hmbXRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc093blNvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICBjb25zdCBsaW50ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGxpbnRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhsaW50ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4ubGludGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApIHx8IHZpb2xhdGVzVGVzdFN0cnVjdHVyZSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXRcbiAgICAgID8gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4gJ291dHB1dCcgaW4gcmVzdWx0ICYmIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KSlcbiAgICAgIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc1R5cGVBd2FyZU94bGludCc+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAvLyBUeXBlLWF3YXJlIG1vZGUgbWFrZXMgb3hsaW50IHJlcG9ydCB0eXBlLWNoZWNrIGRpYWdub3N0aWNzLiBQYXNzIHRoZSBmbGFncyBleHBsaWNpdGx5XG4gICAgICAvLyBiZWNhdXNlIG94bGludCByZWplY3RzIHRoZSBlcXVpdmFsZW50IG9wdGlvbnMgaW4gbm9uLXJvb3QgY29uZmlncywgc28gcGVyLXBhY2thZ2UgcnVuc1xuICAgICAgLy8gaW4gbW9ub3JlcG9zIHdvdWxkIG90aGVyd2lzZSBtaXNzIHR5cGUgZXJyb3JzLlxuICAgICAgLi4uKHByb2plY3QuaGFzVHlwZUF3YXJlT3hsaW50ID8gWyctLXR5cGUtYXdhcmUnLCAnLS10eXBlLWNoZWNrJ10gOiBbXSksXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAnWUFSTicsXG4gICAgJ294Zm10JyxcbiAgICAnLS13cml0ZScsXG4gICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgJyEqKi9wYWNrYWdlLmpzb24nLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IHRvTGludFRhcmdldHMoZmlsZXMpO1xuICByZXR1cm4gW1xuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICBdLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndjogUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LCBmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udG9MaW50VGFyZ2V0cyhmaWxlcyldKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgLy8gRm9ybWF0dGluZyBtdXN0IGdvIHRocm91Z2ggY2FyZ28gKG5vdCBydXN0Zm10IG9uIGluZGl2aWR1YWwgZmlsZXMpIHNvIGVhY2hcbiAgLy8gY3JhdGUncyBlZGl0aW9uIGFuZCBydXN0Zm10IGNvbmZpZ3VyYXRpb24gYXJlIHJlc3BlY3RlZDsgYC0tYWxsYCBjb3ZlcnNcbiAgLy8gZXZlcnkgd29ya3NwYWNlIG1lbWJlciBhbmQgaXMgYSBuby1vcCBzdWZmaXggZm9yIHNpbmdsZS1jcmF0ZSBwcm9qZWN0cy5cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnY2FyZ28nLCAnZm10JywgJy0tYWxsJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdmb3JtYXQnLCAuLi50b0xpbnRUYXJnZXRzKGZpbGVzKV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0TGludENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRvTGludFRhcmdldHMoZmlsZXMpXSk7XG59XG5cbmZ1bmN0aW9uIHRvTGludFRhcmdldHMoZmlsZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICByZXR1cm4gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByZXR0aWVyQXJncyhcbiAgc2VsZkRpclBhdGg6IHN0cmluZyxcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKCFuZWVkc1ByZXR0aWVyKHByb2plY3QpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHByb2plY3RQYXR0ZXJuID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpO1xuICAgIGFyZ3MuYWRkKHBhdGgucmVsYXRpdmUoc2VsZkRpclBhdGgsIHByb2plY3RQYXR0ZXJuKSB8fCBwcm9qZWN0UGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIFsuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHM6IFByb2plY3RbXSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBsZXQgb3duaW5nUHJvamVjdDogUHJvamVjdCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKFxuICAgICAgKGZpbGVQYXRoID09PSBwcm9qZWN0LmRpclBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtwcm9qZWN0LmRpclBhdGh9L2ApKSAmJlxuICAgICAgKCFvd25pbmdQcm9qZWN0IHx8IHByb2plY3QuZGlyUGF0aC5sZW5ndGggPiBvd25pbmdQcm9qZWN0LmRpclBhdGgubGVuZ3RoKVxuICAgICkge1xuICAgICAgb3duaW5nUHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBvd25pbmdQcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAnLS0nIHwgJ18nIHwgJ2ZpbGVzJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbnRUYXJnZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgWy4uLihhcmd2LmZpbGVzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldKSB7XG4gICAgbGludFRhcmdldHMuYWRkKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBbLi4ubGludFRhcmdldHNdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCdkaXJlY3RvcnknIHwgJ290aGVyJz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHJldHVybiAnZGlyZWN0b3J5JztcbiAgfSBjYXRjaCB7XG4gICAgLy8gTWlzc2luZyBwYXRocyBhcmUgaGFuZGxlZCBieSB0aGUgZG93bnN0cmVhbSB0b29scy5cbiAgfVxuXG4gIHJldHVybiAnb3RoZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHJldHVybiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChuZWVkc1ByZXR0aWVyKHByb2plY3QpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHByZXR0aWVyT25seUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXTtcbiAgfVxuICBpZiAoc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihmaWxlUGF0aCwgYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMoXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvblBhdGgnPltdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIHJldHVybiBbXTtcbiAgcmV0dXJuIHByb2plY3RzXG4gICAgLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PlxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCA9PT0gcGF0aC5qb2luKGZpbGVQYXRoLCAncGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApXG4gICAgLm1hcCgocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvblBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhcbiAgcHJvamVjdHM6IFByb2plY3RbXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogeyBsaW50UGF0aDogc3RyaW5nOyBwcm9qZWN0OiBQcm9qZWN0IH1bXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50UHJvamVjdHMgPSBwcm9qZWN0cy5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT4gcHJvamVjdC5kaXJQYXRoID09PSBmaWxlUGF0aCB8fCBwcm9qZWN0LmRpclBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApO1xuICAgIGlmIChkZXNjZW5kYW50UHJvamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRlc2NlbmRhbnRQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+ICh7IGxpbnRQYXRoOiBwcm9qZWN0LmRpclBhdGgsIHByb2plY3QgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cywgZmlsZVBhdGgpO1xuICByZXR1cm4gcHJvamVjdCA/IFt7IGxpbnRQYXRoOiBmaWxlUGF0aCwgcHJvamVjdCB9XSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZWVkc1ByZXR0aWVyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIXByb2plY3QuaGFzT3hmbXQgJiYgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuY29uc3Qgc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMgPSAxMDA7XG5jb25zdCBzdGFsZVByb2Nlc3NNYXhQb2xscyA9IDEwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIGtpbGxMaXN0ZW5pbmdQcm9jZXNzZXNCeVBvcnQocG9ydCk7XG59XG5cbmZ1bmN0aW9uIGtpbGxMaXN0ZW5pbmdQcm9jZXNzZXNCeVBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGlkIG9mIGxpc3RMaXN0ZW5pbmdQcm9jZXNzSWRzKHBvcnQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RMaXN0ZW5pbmdQcm9jZXNzSWRzKHBvcnQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWAsICctc1RDUDpMSVNURU4nXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgICByZXR1cm4gc3Rkb3V0XG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgocGlkKSA9PiBOdW1iZXIocGlkLnRyaW0oKSkpXG4gICAgICAuZmlsdGVyKChwaWQpID0+IE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwICYmIHBpZCAhPT0gcHJvY2Vzcy5waWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWxlUHJvY2Vzc01heFBvbGxzOyBpKyspIHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KHN0YWxlUHJvY2Vzc1BvbGxJbnRlcnZhbE1zKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRVNSQ0gnKSByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcywgcmVtb3ZlU3RhbGVQcm9jZXNzIH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdkZWxheS1tcyc6IHtcbiAgICBkZWZhdWx0OiA1MDAwLFxuICAgIGRlc2NyaWJlOiAnRGVsYXkgYmVmb3JlIHN0YXJ0aW5nIHRoZSBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4nLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcbnR5cGUgTWFpbnRlbmFuY2VBcmd2ID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4gJiB7XG4gIGFjdGlvbjogJ3N0YXJ0JyB8ICdzdG9wJztcbn07XG5jb25zdCBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzID0gNTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuUmV0cnlEZWxheU1zID0gMTAwO1xuY29uc3QgbWF4VGltZW91dERlbGF5TXMgPSAyXzE0N180ODNfNjQ3O1xuY29uc3QgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lID0gJy53Yic7XG5jb25zdCBtYWludGVuYW5jZUh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiamFcIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG4gICAgPHRpdGxlPuODoeODs+ODhuODiuODs+OCueS4rTwvdGl0bGU+XG4gICAgPHN0eWxlPlxuICAgICAgYm9keSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICAgIGNvbG9yOiAjMTExODI3O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICAgICAgfVxuXG4gICAgICBtYWluIHtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICBoMSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjhweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgICAgIH1cblxuICAgICAgcCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuODtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPG1haW4+XG4gICAgICA8aDE+54++5Zyo44Oh44Oz44OG44OK44Oz44K55Lit44Gn44GZPC9oMT5cbiAgICAgIDxwPueahuanmOOBq+OBr+OBlOS4jeS+v+OCkuOBiuOBi+OBkeOBl+OBvuOBmeOBjOOAgeODoeODs+ODhuODiuODs+OCuee1guS6huOBvuOBp+OBl+OBsOOCieOBj+OBiuW+heOBoeOBj+OBoOOBleOBhOOAgjwvcD5cbiAgICA8L21haW4+XG4gIDwvYm9keT5cbjwvaHRtbD5gO1xuXG5leHBvcnQgY29uc3QgbWFpbnRlbmFuY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIE1haW50ZW5hbmNlQXJndj4gPSB7XG4gIGNvbW1hbmQ6ICdtYWludGVuYW5jZSA8YWN0aW9uPicsXG4gIGRlc2NyaWJlOiAnU3RhcnQgb3Igc3RvcCBhIGxpZ2h0d2VpZ2h0IG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLiBFeGFtcGxlOiB3YiBtYWludGVuYW5jZSBzdGFydCcsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJnc1xuICAgICAgLnBvc2l0aW9uYWwoJ2FjdGlvbicsIHtcbiAgICAgICAgY2hvaWNlczogWydzdGFydCcsICdzdG9wJ10gYXMgY29uc3QsXG4gICAgICAgIGRlc2NyaWJlOiAnTWFpbnRlbmFuY2Ugc2VydmVyIGFjdGlvbicsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpIGFzIHVua25vd24gYXMgQXJndjxNYWludGVuYW5jZUFyZ3Y+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IGFyZ3YuYWN0aW9uO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlICR7YWN0aW9ufSBiZWNhdXNlIFdCX0VOViBpcyB0ZXN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZVBvcnQocHJvamVjdC5lbnYuUE9SVCk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYXdhaXQgc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0LCBhcmd2LmRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uID09PSAnc3RvcCcpIHtcbiAgICAgIGF3YWl0IHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWFpbnRlbmFuY2UgYWN0aW9uOiAke2FjdGlvbn1gKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBhc3NlcnQub2soTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCwgYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApO1xuICByZXR1cm4gcG9ydDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIsIGRlbGF5TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhc3NlcnQub2soXG4gICAgTnVtYmVyLmlzRmluaXRlKGRlbGF5TXMpICYmIGRlbGF5TXMgPj0gMCAmJiBkZWxheU1zIDw9IG1heFRpbWVvdXREZWxheU1zLFxuICAgIGBkZWxheS1tcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHttYXhUaW1lb3V0RGVsYXlNc306ICR7ZGVsYXlNc31gXG4gICk7XG5cbiAgY29uc3QgcGlkRmlsZVBhdGggPSBhd2FpdCB3cml0ZU1haW50ZW5hbmNlUGlkRmlsZShwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBjbGVhbnVwID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcHJvY2Vzcy5waWQpO1xuICB9O1xuICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVNpZ25hbEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdURVJNJywgaGFuZGxlU2lnbmFsKTtcbiAgICBwcm9jZXNzLm9mZignU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBoYW5kbGVTaWduYWwpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBoYW5kbGVTaWduYWwpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChkZWxheU1zLCB1bmRlZmluZWQsIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICAgIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgY3JlYXRlQW5kTGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIocG9ydCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHJldHVybjtcblxuICAgIGNvbnNvbGUuaW5mbyhgU3RhcnRlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIGF3YWl0IHdhaXRGb3JTaHV0ZG93bihzZXJ2ZXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBhd2FpdCBjbGVhbnVwKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQW5kTGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIocG9ydDogbnVtYmVyKTogUHJvbWlzZTxodHRwLlNlcnZlciB8IHVuZGVmaW5lZD4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVNYWludGVuYW5jZVNlcnZlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaXN0ZW5NYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIsIHBvcnQsIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKTtcbiAgICAgIHJldHVybiBzZXJ2ZXI7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnICYmIGF0dGVtcHQgPCBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzKSB7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXQobWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSBzZXJ2ZXIgYmVjYXVzZSBwb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBoYW5kbGVNYWludGVuYW5jZVN0YXJ0dXBFcnJvcihwb3J0LCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVW5yZWFjaGFibGUgbWFpbnRlbmFuY2Ugc2VydmVyIHN0YXJ0dXAgc3RhdGUuJyk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQ6IG51bWJlciwgZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbik6IG5ldmVyIHtcbiAgaWYgKGVycm9yLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBNYWludGVuYW5jZSBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSdW50aW1lTWFpbnRlbmFuY2VTZXJ2ZXJFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtpbGxNYWludGVuYW5jZVByb2Nlc3MocHJvamVjdCwgcG9ydCk7XG4gIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgY29uc29sZS5pbmZvKGBTdG9wcGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk6IGh0dHAuU2VydmVyIHtcbiAgcmV0dXJuIGh0dHAuY3JlYXRlU2VydmVyKChfcmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICByZXNwb25zZS53cml0ZUhlYWQoNTAzLCB7XG4gICAgICAnY2FjaGUtY29udHJvbCc6ICduby1zdG9yZScsXG4gICAgICAnY29udGVudC10eXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcsXG4gICAgfSk7XG4gICAgcmVzcG9uc2UuZW5kKG1haW50ZW5hbmNlSHRtbCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0ZW5NYWludGVuYW5jZVNlcnZlcihcbiAgc2VydmVyOiBodHRwLlNlcnZlcixcbiAgcG9ydDogbnVtYmVyLFxuICBvblJ1bnRpbWVFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvblN0YXJ0dXBFcnJvciA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgIHNlcnZlci5vZmYoJ2xpc3RlbmluZycsIG9uTGlzdGVuaW5nKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBjb25zdCBvbkxpc3RlbmluZyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNlcnZlci5vZmYoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgICAgc2VydmVyLm9uKCdlcnJvcicsIG9uUnVudGltZUVycm9yKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIG9uU3RhcnR1cEVycm9yKTtcbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgJzAuMC4wLjAnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTaHV0ZG93bihzZXJ2ZXI6IGh0dHAuU2VydmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2h1dGRvd24gPSAoKTogdm9pZCA9PiB7XG4gICAgICBwcm9jZXNzLm9mZignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHUVVJVCcsIHNodXRkb3duKTtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBjbG9zZSBtYWludGVuYW5jZSBzZXJ2ZXI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXI6IGh0dHAuU2VydmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXJ2ZXIuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFUlJfU0VSVkVSX05PVF9SVU5OSU5HJykge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHNlcnZlci5jbG9zZUFsbENvbm5lY3Rpb25zKCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW50ZW5hbmNlUGlkRmlsZShwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShwaWRGaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGlkRmlsZVBhdGgsIGAke3Byb2Nlc3MucGlkfVxcbmAsICd1dGY4Jyk7XG4gIHJldHVybiBwaWRGaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlkRmlsZVBhdGggPSBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBwaWQgPSBhd2FpdCByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoKTtcbiAgaWYgKHBpZCAhPT0gdW5kZWZpbmVkICYmIHBpZCAhPT0gcHJvY2Vzcy5waWQpIHtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocGlkLCAnU0lHVEVSTScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBhd2FpdCByZW1vdmVTdGFsZVByb2Nlc3MocGlkKTtcbiAgfVxuICBhd2FpdCByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgsIHBpZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nLCBleHBlY3RlZFBpZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhwZWN0ZWRQaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICAgIGlmIChwaWQgIT09IGV4cGVjdGVkUGlkKSByZXR1cm47XG4gIH1cbiAgYXdhaXQgZnMucm0ocGlkRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGlkVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBpZEZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlcihwaWRUZXh0LnRyaW0oKSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwID8gcGlkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdC5yb290RGlyUGF0aCwgcG9ydCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWludGVuYW5jZVBpZEZpbGVQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4ocm9vdERpclBhdGgsIG1haW50ZW5hbmNlUGlkRGlyZWN0b3J5TmFtZSwgYG1haW50ZW5hbmNlLSR7cG9ydH0ucGlkYCk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG4vKipcbiAqIE1hdGVyaWFsaXphdGlvbiBvZiBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcmVnaXN0cnkgKFZlcmRhY2NpbykgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOlxuICogdGhlIHBhY2thZ2VzIGFyZSBkb3dubG9hZGVkIG9uIHRoZSBob3N0IChyZWdpc3RyeSBtYXBwaW5nIHZpYSB0aGUgcHJvamVjdCAubnBtcmMsIGF1dGggdmlhXG4gKiB+Ly5ucG1yYyBsb2NhbGx5IG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSSkgYW5kIGV4dHJhY3RlZCBuZXh0IHRvIHRoZSByZXBvc2l0b3J5IHNvIGltYWdlIGJ1aWxkc1xuICogbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFscyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTY0KS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBSSVZBVEVfUkVHSVNUUllfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbi8vIGBnaXQ6YC9gZ2l0K2AvYGdpdEBgIChub3QgdGhlIGJhcmUgd29yZCBgZ2l0YCk6IG5wbSBhbGxvd3MgYXJiaXRyYXJ5IGRpc3QtdGFncywgc28gYSB0YWcgbmFtZWRcbi8vIGBnaXRgIG9yIGBnaXQtbmV4dGAgbXVzdCBzdGlsbCBiZSB0cmVhdGVkIGFzIGEgcmVnaXN0cnkgc3BlY2lmaWVyLlxuY29uc3Qgbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcyA9IFtcbiAgJ2dpdDonLFxuICAnZ2l0KycsXG4gICdnaXRAJyxcbiAgJ2ZpbGU6JyxcbiAgJ2xpbms6JyxcbiAgJ3dvcmtzcGFjZTonLFxuICAnaHR0cDonLFxuICAnaHR0cHM6JyxcbiAgJ3BvcnRhbDonLFxuICAncGF0Y2g6Jyxcbl07XG5cbi8vIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB3aGljaCBnaXQgc3BlY2lmaWVycyB0aGUgcHJpdmF0ZS1wYWNrYWdlIHRvb2xpbmcgc3VwcG9ydHM6XG4vLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzIGV4YWN0bHkgdGhlc2UsIGFuZCBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGAgbXVzdFxuLy8gcmV3cml0ZSBleGFjdGx5IHRoZXNlIChyZXdyaXRpbmcgb3RoZXIgb3JncycgU1NIIFVSTHMgd291bGQgcG9pbnQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIHBhdGhzKS5cbmNvbnN0IHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybiA9IC9eZ2l0QGdpdGh1YlxcLmNvbTooPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilcXC9bXi8jXSsoPzpcXC5naXQpPyg/OiMuKik/JC87XG5cbi8vIFJldHVybnMgYm9vbGVhbiAobm90IGEgYHZhbHVlIGlzIHN0cmluZ2AgcHJlZGljYXRlKTogYSBwcmVkaWNhdGUgd291bGQgbmFycm93IHRoZSBuZWdhdGl2ZVxuLy8gYnJhbmNoIHRvIGB1bmRlZmluZWRgIGFuZCBicmVhayBgZWxzZSBpZmAgY2hhaW5zIG92ZXIgYHN0cmluZyB8IHVuZGVmaW5lZGAgZGVwZW5kZW5jeSB2YWx1ZXMuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgbmFtZS5zdGFydHNXaXRoKGAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9L2ApICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICFub25SZWdpc3RyeVNwZWNpZmllclByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gdmFsdWUuc3RhcnRzV2l0aChwcmVmaXgpKVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVSZWdpc3RyeUF1dGgge1xuICByZWdpc3RyeVVybDogc3RyaW5nO1xuICBhdXRoVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNZXJnZSB+Ly5ucG1yYyBhbmQgdGhlIHByb2plY3QgLm5wbXJjIChwcm9qZWN0IHNldHRpbmdzIHRha2UgcHJlY2VkZW5jZSkgdG8gcmVzb2x2ZSB0aGUgcHJpdmF0ZVxuICogc2NvcGUncyByZWdpc3RyeSBVUkwgYW5kIHRva2VuLiBWRVJEQUNDSU9fVE9LRU4gc2VydmVzIGFzIHRoZSBmYWxsYmFjayB0b2tlbiBvbiBDSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcml2YXRlUmVnaXN0cnlBdXRoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBucG1yY1BhdGhzID0gW3BhdGguam9pbihvcy5ob21lZGlyKCksICcubnBtcmMnKSwgcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLm5wbXJjJyldO1xuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgcGFyc2VOcG1yYyhmcy5yZWFkRmlsZVN5bmMobnBtcmNQYXRoLCAndXRmOCcpKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG5wbXJjIGZpbGVzIGFyZSBmaW5lOyB0aGUgb3RoZXIgZmlsZSBvciBWRVJEQUNDSU9fVE9LRU4gbWF5IHN0aWxsIHByb3ZpZGUgYXV0aC5cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVVybCA9IGVudHJpZXNbYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnlgXT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghcmVnaXN0cnlVcmwpIHJldHVybjtcblxuICAvLyBucG0tc3R5bGUgVVJJIG1hdGNoaW5nOiBub3JtYWxpemUgYm90aCBzaWRlcyB0byBhIHRyYWlsaW5nIHNsYXNoIHNvIGEgdG9rZW4gZm9yXG4gIC8vIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS9gIGNhbiBuZXZlciBtYXRjaCBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20tb3RoZXIub3JnL2AsIGFuZCBwaWNrIHRoZVxuICAvLyBNT1NUIFNQRUNJRklDIChsb25nZXN0KSBtYXRjaGluZyBwcmVmaXggc28gYC8vaG9zdC9wcml2YXRlL2AgYmVhdHMgYC8vaG9zdC9gLlxuICBjb25zdCBub3JtYWxpemVkUmVnaXN0cnlVcmwgPSBgJHtyZWdpc3RyeVVybC5yZXBsYWNlKC9eaHR0cHM/Oi8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgbGV0IG1hdGNoZWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFByZWZpeExlbmd0aCA9IC0xO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIC8vIFNraXAgZW1wdHkgdG9rZW5zIChhbiB1bnNldCBgJHtWQVJ9YCBleHBhbmRzIHRvICcnKTogYW4gZW1wdHkgbWF0Y2ggbXVzdCBub3QgZGVmZWF0IHRoZVxuICAgIC8vIFZFUkRBQ0NJT19UT0tFTiBmYWxsYmFjayBiZWxvdy5cbiAgICBpZiAoIWtleS5lbmRzV2l0aCgnOl9hdXRoVG9rZW4nKSB8fCAhdmFsdWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke2tleS5zbGljZSgwLCAtJzpfYXV0aFRva2VuJy5sZW5ndGgpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICAgIGlmIChub3JtYWxpemVkUmVnaXN0cnlVcmwuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByZWZpeC5sZW5ndGggPiBtYXRjaGVkUHJlZml4TGVuZ3RoKSB7XG4gICAgICBtYXRjaGVkUHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICAgIG1hdGNoZWRUb2tlbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBObyBQcm9qZWN0IGluc3RhbmNlIGV4aXN0cyBhdCB0aGlzIGxheWVyLCBzbyBwcm9jZXNzLmVudiBpcyB0aGUgb25seSBzb3VyY2UgZm9yIHRoZVxuICAvLyBDSS1pbmplY3RlZCBmYWxsYmFjayB0b2tlbi5cbiAgY29uc3QgYXV0aFRva2VuID0gbWF0Y2hlZFRva2VuID8/IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19UT0tFTjtcbiAgcmV0dXJuIHsgcmVnaXN0cnlVcmwsIGF1dGhUb2tlbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOcG1yYyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3TGluZS50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnOycpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZVxuICAgICAgLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSlcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXCRcXHsoW159XSspXFx9L2csIChfLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXSA/PyAnJyk7XG4gICAgZW50cmllc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogRG93bmxvYWQgYW5kIGV4dHJhY3Qgb25lIHJlZ2lzdHJ5IHBhY2thZ2UgaW50byBgdGFyZ2V0RGlyUGF0aGAuIFRoZSBzcGVjaWZpZXIgbWF5IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgdmVyc2lvbiAodGhlIG9yZydzIGNvbW1vbiBjYXNlIHZpYSBidW5maWcgYGV4YWN0ID0gdHJ1ZWApLCBhbnkgc2VtdmVyIHJhbmdlIChyZXNvbHZlZFxuICogbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkncyBwdWJsaXNoZWQgdmVyc2lvbnMsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGApLCBvciBhXG4gKiBkaXN0LXRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nLFxuICB0YXJnZXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVzb2x2ZVZlcnNpb24oYXV0aCwgcGFja2FnZU5hbWUsIHZlcnNpb25TcGVjaWZpZXIpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPHsgZGlzdD86IHsgdGFyYmFsbD86IHN0cmluZyB9IH0+KFxuICAgIGF1dGgsXG4gICAgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9LyR7dmVyc2lvbn1gXG4gICk7XG4gIGNvbnN0IHRhcmJhbGxVcmwgPSBtZXRhZGF0YS5kaXN0Py50YXJiYWxsO1xuICBpZiAoIXRhcmJhbGxVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmJhbGwgVVJMIGZvciAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259IGluICR7YXV0aC5yZWdpc3RyeVVybH0uYCk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHRhcmJhbGxVcmwpO1xuICBjb25zdCB0YXJiYWxsUGF0aCA9IHBhdGguam9pbihcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLXByaXZhdGUtcGFja2FnZS0nKSksXG4gICAgJ3BhY2thZ2UudGd6J1xuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0YXJiYWxsUGF0aCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBucG0gdGFyYmFsbHMgcGxhY2UgdGhlIGNvbnRlbnQgdW5kZXIgYSB0b3AtbGV2ZWwgYHBhY2thZ2UvYCBkaXJlY3RvcnkuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3RhcicsIFsnLXh6ZicsIHRhcmJhbGxQYXRoLCAnLUMnLCB0YXJnZXREaXJQYXRoLCAnLS1zdHJpcC1jb21wb25lbnRzPTEnXSwge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259ICgke3RhcmJhbGxVcmx9KS5gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5kaXJuYW1lKHRhcmJhbGxQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFByZXJlbGVhc2UgYW5kIGArYnVpbGRgIG1ldGFkYXRhIGFyZSBib3RoIHBhcnQgb2YgdmFsaWQgZXhhY3QgU2VtVmVyIHZlcnNpb25zLCBzbyBhbiBleGFjdFxuICAvLyBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gaXRzZWxmIHdpdGhvdXQgYSBwYWNrdW1lbnQgZmV0Y2guXG4gIGlmIChpc0V4YWN0VmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHZlcnNpb25TcGVjaWZpZXI7XG5cbiAgY29uc3QgcGFja3VtZW50ID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248UGFja3VtZW50PihhdXRoLCBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX1gKTtcbiAgY29uc3QgdmVyc2lvbiA9IHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXIsIHBhY2t1bWVudCk7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzb2x2ZSAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb25TcGVjaWZpZXJ9IGFnYWluc3QgJHthdXRoLnJlZ2lzdHJ5VXJsfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgc2VtdmVyIHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5pbnRlcmZhY2UgUGFja3VtZW50IHtcbiAgJ2Rpc3QtdGFncyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB2ZXJzaW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIG5wbSdzIHNwZWNpZmllciBjbGFzc2lmaWNhdGlvbjogYCpgIGFuZCBkaXN0LXRhZyBuYW1lcyByZXNvbHZlIHZpYSBkaXN0LXRhZ3MgKG5wbSByZXNvbHZlcyBgKmBcbiAqIHRvIHRoZSBgbGF0ZXN0YCB0YWcpLCB3aGlsZSBhbnkgb3RoZXIgdmFsaWQgc2VtdmVyIHJhbmdlIHJlc29sdmVzIHRvIHRoZSBoaWdoZXN0IHB1Ymxpc2hlZFxuICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0LCBtYXRjaGluZyBgbnBtIGluc3RhbGxgJ3MgbWF4LXNhdGlzZnlpbmcgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQodmVyc2lvblNwZWNpZmllcjogc3RyaW5nLCBwYWNrdW1lbnQ6IFBhY2t1bWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ZXJzaW9uU3BlY2lmaWVyICE9PSAnKicgJiYgc2VtdmVyLnZhbGlkUmFuZ2UodmVyc2lvblNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gc2VtdmVyLm1heFNhdGlzZnlpbmcoT2JqZWN0LmtleXMocGFja3VtZW50LnZlcnNpb25zID8/IHt9KSwgdmVyc2lvblNwZWNpZmllcikgPz8gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddPy5bdmVyc2lvblNwZWNpZmllciA9PT0gJyonID8gJ2xhdGVzdCcgOiB2ZXJzaW9uU3BlY2lmaWVyXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWdpc3RyeUpzb248VD4oYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB1cmwpO1xuICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgVDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIC8vIFRhcmJhbGwgVVJMcyBjb21lIGZyb20gcmVnaXN0cnktY29udHJvbGxlZCBtZXRhZGF0YTsgYXR0YWNoIHRoZSB0b2tlbiBvbmx5IHRvIHRoZSBjb25maWd1cmVkXG4gIC8vIHJlZ2lzdHJ5J3Mgb3duIG9yaWdpbiBzbyBhIG1hbGljaW91cyBvciBtaXNjb25maWd1cmVkIHJlZ2lzdHJ5IGNhbm5vdCByZWRpcmVjdCB0aGUgY3JlZGVudGlhbFxuICAvLyB0byBhIHRoaXJkLXBhcnR5IGhvc3QuXG4gIGNvbnN0IHNlbmRBdXRoVG9rZW4gPSAhIWF1dGguYXV0aFRva2VuICYmIGlzU2FtZU9yaWdpbih1cmwsIGF1dGgucmVnaXN0cnlVcmwpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHNlbmRBdXRoVG9rZW4gPyB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoLmF1dGhUb2tlbn1gIH0gOiB7fSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW4odXJsOiBzdHJpbmcsIHJlZ2lzdHJ5VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwpLm9yaWdpbiA9PT0gbmV3IFVSTChyZWdpc3RyeVVybCkub3JpZ2luO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKCcvJywgJyUyRicpO1xufVxuXG4vLyBUaGUgb2ZmaWNpYWwgU2VtVmVyIDIuMC4wIGdyYW1tYXIgKHNlbXZlci5vcmcpLCBhbmNob3JlZDogbnVtZXJpYy1sb29raW5nIGRpc3QtdGFncyBzdWNoIGFzXG4vLyBgMS4yLjNsYXRlc3RgLCBsZWFkaW5nLXplcm8gdmVyc2lvbnMgKGAwMS4yLjNgKSwgYW5kIHVuZGVyc2NvcmUgaWRlbnRpZmllcnMgYXJlIE5PVCB2ZXJzaW9ucyDigJRcbi8vIHJlc29sdmVWZXJzaW9uIHRyZWF0cyB0aGVtIGFzIHRhZ3MsIG1hdGNoaW5nIG5vZGUtc2VtdmVyJ3MgY2xhc3NpZmljYXRpb24uXG5jb25zdCBleGFjdFNlbXZlclBhdHRlcm4gPVxuICAvXig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKSg/Oi0oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKik/KD86XFwrWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKik/JC87XG5cbi8qKiBXaGV0aGVyIHRoZSBzcGVjaWZpZXIgaXMgYW4gZXhhY3QgU2VtVmVyIHZlcnNpb24gKG5vdCBhIHJhbmdlLCB0YWcsIG9yIGdpdCBVUkwpLiAqL1xuZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciBFVkVSWSB2ZXJzaW9uIGBzcGVjaWZpZXJgIGNhbiByZXNvbHZlIHRvIGFsc28gc2F0aXNmaWVzIGByZXF1aXJlbWVudGAgKGV4YWN0IHZlcnNpb25zXG4gKiBjb3VudCBhcyBzaW5nbGUtdmVyc2lvbiByYW5nZXMpLiBDb25mbGljdCBjaGVja3MgdXNlIHRoaXMgYmVjYXVzZSB0aGUgYWN0dWFsbHkgcmVzb2x2ZWQgdmVyc2lvblxuICogaXMgdW5rbm93biBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZDogYSBzdWJzZXQgc3BlY2lmaWVyJ3MgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpc1xuICogZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSB3aWRlciByZXF1aXJlbWVudC4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMpIGFyZSBub3RcbiAqIGNvbXBhcmFibGUgYW5kIHJldHVybiBmYWxzZSDigJQgY2FsbGVycyBhY2NlcHQgdGhvc2Ugb25seSBvbiBleGFjdCBzdHJpbmcgZXF1YWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGVjaWZpZXJTdWJzZXQoc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVpcmVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8IHJlcXVpcmVtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gYCpgIHJlc29sdmVzIHRocm91Z2ggdGhlIGBsYXRlc3RgIGRpc3QtdGFnIChzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCksIG5vdCBhcyBhIHJhbmdlLCBzb1xuICAvLyBpdCBpcyBub3Qgc3RhdGljYWxseSBjb21wYXJhYmxlIGluIGVpdGhlciBwb3NpdGlvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonIHx8IHJlcXVpcmVtZW50ID09PSAnKicpIHJldHVybiBmYWxzZTtcbiAgLy8gQnVpbGQgbWV0YWRhdGEgZGlzdGluZ3Vpc2hlcyByZWdpc3RyeSBhcnRpZmFjdHMgKHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyXG4gIC8vIHZlcmJhdGltKSBidXQgc2VtdmVyIGNvbXBhcmlzb25zIGlnbm9yZSBpdCwgc28gdHdvIGV4YWN0IHZlcnNpb25zIG11c3QgbWF0Y2ggYXMgc3RyaW5ncy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikgJiYgaXNFeGFjdFZlcnNpb24ocmVxdWlyZW1lbnQpKSByZXR1cm4gc3BlY2lmaWVyID09PSByZXF1aXJlbWVudDtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpIHx8ICFzZW12ZXIudmFsaWRSYW5nZShyZXF1aXJlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNlbXZlci5zdWJzZXQoc3BlY2lmaWVyLCByZXF1aXJlbWVudCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbWF0ZXJpYWxpemVkIGB2ZXJzaW9uYCBjYW4gYmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cywgc28gYW4gZXhhY3Qgc3BlY2lmaWVyIGFkbWl0cyBvbmx5IHRoZVxuICAvLyBpZGVudGljYWwgdmVyc2lvbiBzdHJpbmcuXG4gIGlmIChpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXIpKSByZXR1cm4gc3BlY2lmaWVyID09PSB2ZXJzaW9uO1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGluc3RhbGxlZCBgdmVyc2lvbmAgaXMgc3RhdGljYWxseSBLTk9XTiB0byBzYXRpc2Z5IHRoZSByZWdpc3RyeSBgc3BlY2lmaWVyYC5cbiAqIERpc3QtdGFncyAoaW52YWxpZCByYW5nZXMpIGFyZSBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYW5kIHJldHVybiBmYWxzZSDigJQgdW5saWtlXG4gKiBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzLCBjYWxsZXJzIHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIGFuIGluc3RhbGxlZCBjb3B5IGNhbiByZXBsYWNlXG4gKiBhIHJlZ2lzdHJ5IGRvd25sb2FkLCBzbyB1bmNlcnRhaW50eSBtdXN0IGZhbGwgYmFjayB0byBkb3dubG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgc28gbGlrZSBhbnkgb3RoZXJcbiAgLy8gZGlzdC10YWcgaXQgaXMgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFnYWluc3QgYW4gaW5zdGFsbGVkIHZlcnNpb24uXG4gIGlmIChzcGVjaWZpZXIgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyByZXNvbHZlVmVyc2lvbiBmZXRjaGVzIGFuIGV4YWN0IHNwZWNpZmllciB2ZXJiYXRpbSAoYnVpbGQgbWV0YWRhdGEgaW5jbHVkZWQpLCBzbyBhbiBpbnN0YWxsZWRcbiAgLy8gY29weSBtYXkgcmVwbGFjZSB0aGUgZG93bmxvYWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIHN0cmluZ3MgbWF0Y2ggZXhhY3RseS5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIHJldHVybiAhIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgJiYgc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGZpbmRSb290QW5kU2VsZlByb2plY3RzLCB0eXBlIEZvdW5kUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVSZWdpc3RyeS5qcyc7XG5pbXBvcnQge1xuICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UsXG4gIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHNwZWNpZmllclN1YnNldCxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqXG4gICAqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMgdGhhdCBtdXN0IGJlIGRvd25sb2FkZWQ7IHNldCBmb3IgZ2l0IHBhY2thZ2VzIGFuZCBmb3JcbiAgICogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgaW4gbm9kZV9tb2R1bGVzIGFscmVhZHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXJcbiAgICogKHNvIENJIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgY2FuIHN0aWxsIG1hdGVyaWFsaXplIHRoZW0pLlxuICAgKi9cbiAgc291cmNlRGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBvbmNlIGFuIGluc3RhbGxlZCBjb3B5IGlzIHNlbGVjdGVkIG9yIGEgZG93bmxvYWQgaXMgZXh0cmFjdGVkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnb3V0LWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdG9yeSB0byBjb3B5IHByaXZhdGUgcGFja2FnZXMgaW50bycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ0B3aWxsYm9vc3RlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHsgZHJ5UnVuPzogYm9vbGVhbiB9LCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cC1wcml2YXRlLXBhY2thZ2VzJyxcbiAgZGVzY3JpYmU6XG4gICAgJ01hdGVyaWFsaXplIHByaXZhdGUgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOiBjb3B5IGdpdCBkZXBlbmRlbmNpZXMsIHJldXNlIGluc3RhbGxlZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGV4YWN0LXZlcnNpb24gb3Igc2VtdmVyLXJhbmdlIHNwZWNpZmllciB0aGUgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzLCBhbmQgZG93bmxvYWQgdGhlIHJlc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSTsgZGlzdC10YWcgc3BlY2lmaWVycyBzdWNoIGFzIGBsYXRlc3RgIGFsd2F5cyBkb3dubG9hZCkuICcgK1xuICAgICdUaGUgRG9ja2VyZmlsZSBtdXN0IENPUFkgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyAoZS5nLiBgQ09QWSBAd2lsbGJvb3N0ZXIvIEB3aWxsYm9vc3Rlci9gIGFuZCBgQ09QWSBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8gQHdpbGxib29zdGVyLXByaXZhdGUvYCkgc28gdGhlIGluLWltYWdlIGluc3RhbGwgcmVzb2x2ZXMgdGhlIHJld3JpdHRlbiBmaWxlOiBwYXRocy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCByb290QW5kU2VsZiA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXJvb3RBbmRTZWxmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFJlc29sdmUgdGhlIGRlc2NlbmRhbnQgc2V0IGZyb20gdGhlIHJlcG9zaXRvcnkgUk9PVCAobm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkgc28gdGhlXG4gICAgLy8gY29tbWFuZCBzY2FucyB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0IHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgcnVuczpcbiAgICAvLyBmaW5kRGVzY2VuZGFudFByb2plY3RzIHJldHVybnMgb25seSB0aGUgY3VycmVudCBwcm9qZWN0IHdoZW4gaW52b2tlZCBmcm9tIGEgd29ya3NwYWNlLlxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcm9vdEFuZFNlbGYucm9vdC5kaXJQYXRoKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0OiBhIHByaXZhdGUgZGVwZW5kZW5jeSBtYXkgYmUgZGVjbGFyZWQgaW5cbiAgICAvLyBhIHN1Yi1wYWNrYWdlIChlLmcuIHBhY2thZ2VzL3NlcnZlcikgcmF0aGVyIHRoYW4gdGhlIHJvb3QsIHlldCBpdCBzdGlsbCBtYXRlcmlhbGl6ZXMgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290IHNvIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCByZXNvbHZlcyBpdCB1bmlmb3JtbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0cyksIHtcbiAgICAgICAgb3V0RGlyOiBhcmd2Lm91dERpcixcbiAgICAgICAgZHJ5UnVuOiBCb29sZWFuKGFyZ3YuZHJ5UnVuKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zIHtcbiAgLyoqIERpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCkgdGhhdCBnaXQgZGVwZW5kZW5jaWVzIGFyZSBjb3BpZWQgaW50by4gKi9cbiAgb3V0RGlyPzogc3RyaW5nO1xuICBkcnlSdW4/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIHJvb3QgbWFuaWZlc3QgZm9sbG93ZWQgYnkgZWFjaCBkaXN0aW5jdCB3b3Jrc3BhY2UgbWFuaWZlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0czogRm91bmRQcm9qZWN0cyk6IFBhY2thZ2VKc29uW10ge1xuICBjb25zdCBtYW5pZmVzdHNCeURpclBhdGggPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZUpzb24+KCk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBbcHJvamVjdHMucm9vdCwgLi4ucHJvamVjdHMuZGVzY2VuZGFudHNdKSB7XG4gICAgaWYgKCFtYW5pZmVzdHNCeURpclBhdGguaGFzKHByb2plY3QuZGlyUGF0aCkpIG1hbmlmZXN0c0J5RGlyUGF0aC5zZXQocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnBhY2thZ2VKc29uKTtcbiAgfVxuICByZXR1cm4gWy4uLm1hbmlmZXN0c0J5RGlyUGF0aC52YWx1ZXMoKV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdFByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0UGFja2FnZUpzb25zOiBQYWNrYWdlSnNvbltdLFxuICBvcHRpb25zOiBNYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgb3V0RGlyID0gJ0B3aWxsYm9vc3RlcicsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE91dHB1dCBwYXRocyBhcmUgcmVjdXJzaXZlbHkgREVMRVRFRCBiZWZvcmUgYmVpbmcgcmVjcmVhdGVkLCBzbyBub25lIG9mIHRoZW0gbWF5IGNvbnRhaW4gYVxuICAvLyBzeW1saW5rIGNvbXBvbmVudDogYSBzeW1saW5rIChlLmcuIGBlc2NhcGUgLT4gbm9kZV9tb2R1bGVzYCwgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlYFxuICAvLyBpdHNlbGYgbGlua2luZyBlbHNld2hlcmUpIHdvdWxkIGVpdGhlciBzbXVnZ2xlIHRoZSBkZWxldGUgcGFzdCB0aGUgbGV4aWNhbCBvdmVybGFwIGd1YXJkc1xuICAvLyBvciBkZXN0cm95IHRoZSBzeW1saW5rJ3MgdGFyZ2V0LiBSZWplY3RpbmcgY2Fub25pY2FsL2xleGljYWwgbWlzbWF0Y2hlcyBrZWVwcyBldmVyeVxuICAvLyBkZXN0cnVjdGl2ZSBvcGVyYXRpb24gb24gdGhlIGludGVuZGVkIGxleGljYWwgbG9jYXRpb24uIFRoZXNlIGd1YXJkcyBUSFJPVyAobm90IHByb2Nlc3MuZXhpdClcbiAgLy8gc28gdGhlIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIGNhbGxlciBjYW4gY2F0Y2ggdGhlbSBhbmQgY29udGludWVcbiAgLy8gbm9uLWZhdGFsbHk7IHRoZSBleHBsaWNpdCBjb21tYW5kJ3MgaGFuZGxlciBjYXRjaGVzIGFuZCBleGl0cy5cbiAgY29uc3Qgcm9vdERpclBhdGggPSBjYW5vbmljYWxpemVQYXRoKHJvb3RQcm9qZWN0RGlyUGF0aCk7XG4gIGNvbnN0IHJlc29sdmVPdXRwdXREaXJQYXRoID0gKHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGg6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgbGV4aWNhbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGgpO1xuICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGxleGljYWxQYXRoKTtcbiAgICBpZiAoY2Fub25pY2FsUGF0aCAhPT0gbGV4aWNhbFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtsYWJlbH0gbXVzdCBub3QgY29udGFpbiBzeW1saW5rcyAoJHtsZXhpY2FsUGF0aH0gcmVzb2x2ZXMgdG8gJHtjYW5vbmljYWxQYXRofSkuYCk7XG4gICAgfVxuICAgIHJldHVybiBsZXhpY2FsUGF0aDtcbiAgfTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKG91dERpciwgJy0tb3V0LWRpcicpO1xuICBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyBhbHdheXMgbWF0ZXJpYWxpemUgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdDogYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgXG4gIC8vIHJlc29sdmVzIHRoZW0gZnJvbSBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlYCByZWdhcmRsZXNzIG9mIGAtLW91dC1kaXJgLlxuICBjb25zdCByZWdpc3RyeU91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIGBUaGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBvdXRwdXQgZGlyZWN0b3J5YFxuICApO1xuICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAvLyBlLmcuIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGVgIG9yIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGUvc3ViYDogdGhlXG4gICAgLy8gcmVnaXN0cnkgc3RlcCByZWN1cnNpdmVseSBkZWxldGVzIHJlZ2lzdHJ5T3V0RGlyUGF0aCwgd2hpY2ggd291bGQgZGVzdHJveSB0aGUgZ2l0XG4gICAgLy8gcGFja2FnZXMgY29waWVkIGludG8gYW4gZXF1YWwgb3IgTkVTVEVEIGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAtLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSByZWdpc3RyeSBvdXRwdXQgZGlyZWN0b3J5LmApO1xuICB9XG4gIGNvbnN0IHN0YWdpbmdSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLXN0YWdpbmcnKSwgJ1RoZSBzdGFnaW5nIGRpcmVjdG9yeScpO1xuICBjb25zdCBiYWNrdXBSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLWJhY2t1cCcpLCAnVGhlIGJhY2t1cCBkaXJlY3RvcnknKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCBjYW5vbmljYWxpemVQYXRoKHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpKSkpIHtcbiAgICAvLyBUaGUgcmVjdXJzaXZlIGRlbGV0ZSBvZiBvdXREaXJQYXRoIHdvdWxkIGRlc3Ryb3kgdGhlIGluc3RhbGxlZCBzb3VyY2VzIHRoZSBjb3BpZXMgcmVhZC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJy0tb3V0LWRpciBtdXN0IG5vdCBvdmVybGFwIG5vZGVfbW9kdWxlcy4nKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtsYWJlbCwgdGVtcG9yYXJ5RGlyUGF0aF0gb2YgW1xuICAgIFsnc3RhZ2luZycsIHN0YWdpbmdSb290RGlyUGF0aF0sXG4gICAgWydiYWNrdXAnLCBiYWNrdXBSb290RGlyUGF0aF0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpIHx8IHBhdGhzT3ZlcmxhcChyZWdpc3RyeU91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpKSB7XG4gICAgICAvLyBCb3RoIGRpcmVjdG9yaWVzIGFyZSByZWN1cnNpdmVseSByZWNyZWF0ZWQsIHNpbGVudGx5IGRpc2NhcmRpbmcgYW55dGhpbmcgbWF0ZXJpYWxpemVkIGludG9cbiAgICAgIC8vIGFuIGVxdWFsIG9yIG5lc3RlZCBvdXRwdXQgZGlyZWN0b3J5IG1vbWVudHMgZWFybGllci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yaWVzIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7bGFiZWx9IGRpcmVjdG9yeSAoJHt0ZW1wb3JhcnlEaXJQYXRofSkuYCk7XG4gICAgfVxuICB9XG4gIC8vIFN0YWdpbmcgTUlSUk9SUyBlYWNoIG91dHB1dCB0cmVlJ3MgcmVwb3NpdG9yeS1yb290LXJlbGF0aXZlIGxvY2F0aW9uIChlLmcuXG4gIC8vIGA8cm9vdD4vQHdpbGxib29zdGVyLXByaXZhdGUvYWAgc3RhZ2VzIGF0IGA8c3RhZ2luZz4vQHdpbGxib29zdGVyLXByaXZhdGUvYWApLCBzbyB0aGUgcmVsYXRpdmVcbiAgLy8gZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvIHN0YWdlZCB0cmVlcyBlcXVhbHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLiBUaGF0XG4gIC8vIG1ha2VzIGNyb3NzLXRyZWUgYGZpbGU6YCByZXdyaXRlcyAoZS5nLiBgLi4vLi4vQHdpbGxib29zdGVyLzxuYW1lPmApIGNvbXB1dGVkIGFnYWluc3Qgc3RhZ2luZ1xuICAvLyBjb3JyZWN0IGFmdGVyIHRoZSBzd2FwLCB3aGljaCBsZXRzIGV2ZXJ5IGZhaWx1cmUtcHJvbmUgc3RlcCDigJQgZG93bmxvYWQsIGV4dHJhY3Rpb24sIG5lc3RlZFxuICAvLyBkaXNjb3ZlcnksIHJld3JpdGluZyDigJQgZmluaXNoIGJlZm9yZSBlaXRoZXIgbGl2ZSB0cmVlIGlzIHRvdWNoZWQuXG4gIGNvbnN0IHRvU3RhZ2VkUGF0aCA9IChmaW5hbFBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIHBhdGguam9pbihzdGFnaW5nUm9vdERpclBhdGgsIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGZpbmFsUGF0aCkpO1xuICBpZiAocGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCkgIT09ICdAd2lsbGJvb3N0ZXInKSB7XG4gICAgLy8gUHJlLWV4aXN0aW5nIGxpbWl0YXRpb24gb2YgdGhlIG9wdGlvbjogdGhlIERvY2tlciBtYW5pZmVzdCByZXdyaXRlIGhhcyBubyBhY2Nlc3MgdG8gaXQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAnTm90ZTogd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCByZXdyaXRlcyBnaXQgZGVwZW5kZW5jaWVzIHRvIDxyb290Pi9Ad2lsbGJvb3N0ZXI7IGEgY3VzdG9tIC0tb3V0LWRpciByZXF1aXJlcyBhIG1hdGNoaW5nIERvY2tlcmZpbGUgbGF5b3V0LidcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IGF3YWl0IGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gICAgcm9vdERpclBhdGgsXG4gICAgbWFuaWZlc3RQYWNrYWdlSnNvbnMsXG4gICAgb3V0RGlyUGF0aCxcbiAgICByZWdpc3RyeU91dERpclBhdGhcbiAgKTtcblxuICBpZiAoZHJ5UnVuKSB7XG4gICAgcHJpbnREcnlSdW5SZXN1bHQob3V0RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB3aG9zZSBpbnN0YWxsZWQgY29weSBzYXRpc2ZpZXMgdGhlIHNwZWNpZmllciBhcmUgY29waWVkIGZyb21cbiAgLy8gbm9kZV9tb2R1bGVzOyBvbmx5IHRoZSByZXN0IGFyZSBkb3dubG9hZGVkLCBzbyByZWdpc3RyeSBjcmVkZW50aWFscyBhcmUgbmVlZGVkIG9ubHkgd2hlbiBhXG4gIC8vIGRvd25sb2FkIGFjdHVhbGx5IGhhcHBlbnMgKENJIHRlc3Qgc3RlcHMgZGVsaWJlcmF0ZWx5IHJlY2VpdmUgbm8gVmVyZGFjY2lvIHRva2VuKS5cbiAgY29uc3QgZG93bmxvYWRlZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIXAuc291cmNlRGlyUGF0aCk7XG4gIC8vIFJlc29sdmUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBCRUZPUkUgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIG1hdGVyaWFsaXphdGlvbnMsIHNvIGEgbWlzc2luZ1xuICAvLyByZWdpc3RyeSBjb25maWd1cmF0aW9uIGNhbm5vdCBkZXN0cm95IGEgcHJldmlvdXNseSB1c2FibGUgb3V0cHV0IHRyZWUuIFRocm93IChyYXRoZXIgdGhhblxuICAvLyBleGl0KSBzbyBjYWxsZXJzIGNhbiBkZWNpZGU6IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXBvcnRzIGl0IGFuZCBleGl0cywgd2hpbGUgdGhlXG4gIC8vIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIHN0ZXAgY2F0Y2hlcyBpdCBhbmQgY29udGludWVzLCBsZWF2aW5nIHRoZVxuICAvLyBleGlzdGluZyBvdXRwdXQgdW50b3VjaGVkIChub3RoaW5nIGhhcyBiZWVuIGRlbGV0ZWQgeWV0IGF0IHRoaXMgcG9pbnQpLlxuICBjb25zdCBhdXRoID0gZG93bmxvYWRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgPyByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkb3dubG9hZGVkUGFja2FnZXMubGVuZ3RoID4gMCAmJiAhYXV0aD8uYXV0aFRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCBkb3dubG9hZCAke2Rvd25sb2FkZWRQYWNrYWdlcy5tYXAoKHApID0+IHAubmFtZSkuam9pbignLCAnKX06IHJ1biB3YmZ5IHRvIGdlbmVyYXRlIHRoZSByZXBvc2l0b3J5IC5ucG1yYyBhbmQgY29uZmlndXJlIGl0cyB0b2tlbiBpbiB+Ly5ucG1yYyAob3IgVkVSREFDQ0lPX1RPS0VOIG9uIENJKS4gYCArXG4gICAgICAgIGBPbmx5IGluc3RhbGxlZCBjb3BpZXMgc2F0aXNmeWluZyBhbiBleGFjdCB2ZXJzaW9uIG9yIGAgK1xuICAgICAgICAnc2VtdmVyIHJhbmdlIGFyZSByZXVzZWQgd2l0aG91dCByZWdpc3RyeSBhY2Nlc3M7IGRpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYGxhdGVzdGApIGFsd2F5cyByZXF1aXJlIGl0LidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuXG4gIC8vIE1hdGVyaWFsaXplIEJPVEggdHJlZXMgaW50byBzdGFnaW5nIGFuZCBzd2FwIHRoZW0gaW4gb25seSBhZnRlciBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXBcbiAgLy8gc3VjY2VlZGVkOiBhIHJlZ2lzdHJ5IGZldGNoL2V4dHJhY3Rpb24vbmVzdGVkLWRpc2NvdmVyeS9yZXdyaXRlIGZhaWx1cmUgbXVzdCBsZWF2ZSBib3RoIGxpdmVcbiAgLy8gdHJlZXMgZXhhY3RseSBhcyB0aGV5IHdlcmUuIE90aGVyd2lzZSB0aGUgYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWBcbiAgLy8gY2FsbGVyIOKAlCB3aGljaCBjYXRjaGVzIHRoZSBmYWlsdXJlIGFuZCBjb250aW51ZXMg4oCUIHdvdWxkIHJld3JpdGUgZGVwZW5kZW5jaWVzIGFnYWluc3RcbiAgLy8gaW5jb25zaXN0ZW50IHRyZWVzIChlLmcuIGEgcmVnaXN0cnkgbWFuaWZlc3QgcG9pbnRpbmcgYXQgYSBkZWxldGVkIGBAd2lsbGJvb3N0ZXIvPG5hbWU+YCkuXG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdSb290RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LCBhbmRcbiAgICAvLyBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRvU3RhZ2VkUGF0aChvdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodG9TdGFnZWRQYXRoKHJlZ2lzdHJ5T3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSwgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiByZWdpc3RyeVBhY2thZ2VzKSB7XG4gICAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAvLyBkb3dubG9hZGVkUGFja2FnZXMgaXMgbm9uLWVtcHR5IG9uIHRoaXMgcGF0aCwgc28gdGhlIGF1dGggY2hlY2sgYWJvdmUgcGFzc2VkLlxuICAgICAgICBhdXRoISxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICApO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oXG4gICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG4gICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZSBiZWZvcmVcbiAgICAgIC8vIGV4dHJhY3Rpb247IG1hdGVyaWFsaXplIHRoZW0gdG9vLiBJbnN0YWxsZWQgY29waWVzIHdlcmUgYWxyZWFkeSBkZWVwLXNjYW5uZWQgYnlcbiAgICAgIC8vIGNvbGxlY3RQcml2YXRlUGFja2FnZXMuXG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCEsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKHN0YWdpbmdSb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpO1xuICAgIGF3YWl0IHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhbb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoXSwgdG9TdGFnZWRQYXRoLCBiYWNrdXBSb290RGlyUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ1Jvb3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKFxuICAgIGBFbnN1cmUgdGhlIERvY2tlcmZpbGUgQ09QWXMgJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKX0vIGFuZCAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LyBpbnRvIHRoZSBpbWFnZSBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTZWVkIGZyb20gZXZlcnkgbWFuaWZlc3QgKHJvb3QgKyB3b3Jrc3BhY2VzKTsgb25lIHByaXZhdGUgcGFja2FnZSBtYXkgYmUgcmVxdWVzdGVkIGJ5IHNldmVyYWxcbiAgLy8gbWFuaWZlc3RzLCBzbyBtZXJnZSBkdXBsaWNhdGVzIHRoZSBzYW1lIHdheSBuZXN0ZWQgZGlzY292ZXJ5IGRvZXMg4oCUIGtlZXAgdGhlIG5hcnJvd2VyXG4gIC8vIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQgYW5kIGZhaWwgbG91ZGx5IG9uIGEgZ2VudWluZSBjb25mbGljdC5cbiAgY29uc3QgcGFja2FnZXNUb1Byb2Nlc3M6IFByaXZhdGVQYWNrYWdlW10gPSBbXTtcbiAgY29uc3QgcXVldWVkUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb24gb2YgbWFuaWZlc3RQYWNrYWdlSnNvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KHJlcXVlc3RlZC5uYW1lKTtcbiAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChyZXF1ZXN0ZWQubmFtZSwgcmVxdWVzdGVkKTtcbiAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChyZXF1ZXN0ZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCByZXF1ZXN0ZWQpO1xuICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCByZXF1ZXN0ZWQsIHBhY2thZ2VKc29uLm5hbWUgPz8gJ2Egd29ya3NwYWNlIG1hbmlmZXN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VzVG9Qcm9jZXNzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlID0gcGFja2FnZXNUb1Byb2Nlc3NbaW5kZXhdO1xuICAgIGlmICghcHJpdmF0ZVBhY2thZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKHByaXZhdGVQYWNrYWdlLm5hbWUpKSBjb250aW51ZTtcblxuICAgIGlmIChwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0Jykge1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICB9XG4gICAgLy8gU2VsZWN0ZWQgQkVGT1JFIHRoZSBkZWVwIHNjYW46IGEgbWFuaWZlc3QgaW5zaWRlIHRoZSBwYWNrYWdlIG1heSByZWZlciBiYWNrIHRvIHRoZSBwYWNrYWdlXG4gICAgLy8gaXRzZWxmLCBhbmQgdGhhdCByZXF1aXJlbWVudCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gKGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0XG4gICAgLy8gYmVsb3cpLCBuZXZlciBuYXJyb3cgdGhlIGFscmVhZHktc2VsZWN0ZWQgc3BlY2lmaWVyLlxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIC8vIE5lc3RlZCBwcml2YXRlIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgcGFja2FnZSBhcmUgZGlzY292ZXJhYmxlIHJpZ2h0IGF3YXk7IHJlZ2lzdHJ5XG4gICAgLy8gcGFja2FnZXMgd2l0aG91dCBhIHVzYWJsZSBpbnN0YWxsZWQgY29weSBhcmUgaW5zcGVjdGVkIGFmdGVyIGRvd25sb2FkIGluc3RlYWRcbiAgICAvLyAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlZCkge1xuICAgICAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChuZXN0ZWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKG5lc3RlZC5uYW1lKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBtYXRlcmlhbGl6ZWQgKG9yIHNlbGVjdGVkKTogdGhlIHJlcXVpcmVtZW50IG11c3QgYWRtaXQgdGhhdCBzZWxlY3Rpb24uXG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0aWxsIHF1ZXVlZDoga2VlcCB0aGUgTkFSUk9XRVIgY29tcGF0aWJsZSByZXF1aXJlbWVudCBzbyBkaXNjb3Zlcnkgb3JkZXIgY2Fubm90XG4gICAgICAgICAgICAvLyB0dXJuIGNvbXBhdGlibGUgY29uc3RyYWludHMgKGUuZy4gYF4xLjAuMGAgYW5kIGAxLjIuM2ApIGludG8gYSBzcHVyaW91cyBjb25mbGljdC5cbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCBuZXN0ZWQpO1xuICAgICAgICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcXVldWVkLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcml2YXRlUGFja2FnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIGV4dHJhY3RlZFBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZyxcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBFdmVyeSBtYXRlcmlhbGl6ZWQgcGFja2FnZSDigJQgaW5jbHVkaW5nIGEgbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBnaXQgZGVwZW5kZW5jeSDigJQgbGl2ZXMgaW5cbiAgLy8gc3RhZ2luZyB1bnRpbCB0aGUgYXRvbWljIHN3YXAsIHNvIGl0cyBtYW5pZmVzdHMgbXVzdCBiZSByZWFkIHRoZXJlLlxuICBjb25zdCBleHRyYWN0ZWREaXJQYXRoID0gdG9TdGFnZWRQYXRoKGV4dHJhY3RlZFBhY2thZ2UudGFyZ2V0RGlyUGF0aCk7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIWV4aXN0aW5nLnNvdXJjZURpclBhdGggJiYgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdGlsbCBhd2FpdGluZyBpdHMgZG93bmxvYWQgKG5vIGluc3RhbGxlZCBjb3B5IHNlbGVjdGVkLCBub3RoaW5nIGV4dHJhY3RlZCB5ZXQpOiBrZWVwXG4gICAgICAgICAgLy8gdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQsIGV4YWN0bHkgYXMgY29sbGVjdFByaXZhdGVQYWNrYWdlcyBkb2VzIGZvclxuICAgICAgICAgIC8vIHF1ZXVlZCBwYWNrYWdlcywgc28gbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBjb25zdHJhaW50cyBjYW5ub3QgZmFicmljYXRlIGNvbmZsaWN0cy5cbiAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCBuZXN0ZWQpO1xuICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseVxuICAgICAgICAgIC8vIHZpb2xhdGUgdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQpO1xuICAgICAgICBuZXN0ZWQuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICAgICAgaWYgKG5lc3RlZC5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIG5lc3RlZC5uYW1lLFxuICAgICAgICAgICAgbmVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXN0ZWQucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24odG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSwgbmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogYGRlc3RpbmF0aW9uRGlyUGF0aGAgbWF5IGRpZmZlciBmcm9tIGB0YXJnZXREaXJQYXRoYCB3aGlsZSByZWdpc3RyeSBwYWNrYWdlcyBzdGFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlJbnN0YWxsZWRQYWNrYWdlKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIGRlc3RpbmF0aW9uRGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSByZWdpc3RyeSBwYWNrYWdlJ3MgdGFyYmFsbCBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gbm9kZV9tb2R1bGVzLyBjb250ZW50IHZpYVxuICAvLyBidW5kbGVkRGVwZW5kZW5jaWVzOyB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgYXJ0aWZhY3QgYW5kIG11c3Qgc3Vydml2ZSB0aGUgY29weS4gR2l0XG4gIC8vIGNoZWNrb3V0cyAoYW5kIG5vbi1idW5kbGVkIG5hbWVzKSBzdGlsbCBleGNsdWRlIG5vZGVfbW9kdWxlcywgd2hpY2ggaG9sZHMgbG9jYWxseSBpbnN0YWxsZWRcbiAgLy8gZGVwZW5kZW5jaWVzIHRoZXJlLlxuICBjb25zdCBidW5kbGVkRGVwZW5kZW5jeU5hbWVzID1cbiAgICBwcml2YXRlUGFja2FnZS5raW5kID09PSAncmVnaXN0cnknID8gcmVhZEJ1bmRsZWREZXBlbmRlbmN5TmFtZXMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEpIDogW107XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBkZXN0aW5hdGlvbkRpclBhdGgsIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgZm9yY2U6IHRydWUsXG4gICAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGV4cG9zZXMgaW5zdGFsbGVkIHBhY2thZ2VzIHRocm91Z2ggc3ltbGlua3M7IHRoZSBtYXRlcmlhbGl6ZWQgdHJlZVxuICAgIC8vIG11c3QgY29udGFpbiByZWFsIGZpbGVzIChhIGNvcGllZCBhYnNvbHV0ZSBzeW1saW5rIHdvdWxkIGRhbmdsZSBpbnNpZGUgdGhlIERvY2tlciBpbWFnZSxcbiAgICAvLyBhbmQgbGF0ZXIgZGVwZW5kZW5jeSByZXdyaXRpbmcgd291bGQgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUpLlxuICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnJlbGF0aXZlKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcygnLmdpdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub2RlTW9kdWxlc0luZGV4ID0gc2VnbWVudHMuaW5kZXhPZignbm9kZV9tb2R1bGVzJyk7XG4gICAgICBpZiAobm9kZU1vZHVsZXNJbmRleCA9PT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgbm9kZV9tb2R1bGVzIChhbmQgQHNjb3BlKSBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIG11c3QgY29weSBzbyBidW5kbGVkIHN1YnRyZWVzIGNhbjtcbiAgICAgIC8vIG9ubHkgdGhlIGZpcnN0IG5vZGVfbW9kdWxlcyBsZXZlbCBmaWx0ZXJzIOKAlCBhbnl0aGluZyBpbnNpZGUgYSBidW5kbGVkIHN1YnRyZWUgYmVsb25ncyB0b1xuICAgICAgLy8gdGhlIGFydGlmYWN0LCBpbmNsdWRpbmcgaXRzIG93biBuZXN0ZWQgbm9kZV9tb2R1bGVzLlxuICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gc2VnbWVudHMuc2xpY2Uobm9kZU1vZHVsZXNJbmRleCArIDEpO1xuICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSAmJiBzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7Zmlyc3R9L2ApKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZmlyc3Quc3RhcnRzV2l0aCgnQCcpID8gYCR7Zmlyc3R9LyR7c2Vjb25kfWAgOiBmaXJzdDtcbiAgICAgIHJldHVybiBidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmluY2x1ZGVzKHBhY2thZ2VOYW1lKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKiogRGVjbGFyZWQgYnVuZGxlZCBkZXBlbmRlbmN5IG5hbWVzIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZTsgYHRydWVgIGJ1bmRsZXMgZXZlcnkgZGVwZW5kZW5jeS4gKi9cbmZ1bmN0aW9uIHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHNvdXJjZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHwgdHJ1ZSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgICBidW5kbGVEZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB8IGJvb2xlYW47XG4gICAgICBidW5kbGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgIH07XG4gICAgY29uc3QgYnVuZGxlZCA9IHBhY2thZ2VKc29uLmJ1bmRsZURlcGVuZGVuY2llcyA/PyBwYWNrYWdlSnNvbi5idW5kbGVkRGVwZW5kZW5jaWVzO1xuICAgIGlmIChidW5kbGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidW5kbGVkKSA/IGJ1bmRsZWQuZmlsdGVyKChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIDogW107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoYSByYW5nZSByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0XG4gKiB0aGUgcmVnaXN0cnkg4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIGl0IGlzXG4gKiBndWFyYW50ZWVkIHNhdGlzZmllZDogYGV4aXN0aW5nYCBtdXN0IGJlIGEgc3Vic2V0IG9mIGl0IChldmVyeSBwb3NzaWJsZSByZXNvbHV0aW9uIG9mIGBleGlzdGluZ2BcbiAqIHRoZW4gc2F0aXNmaWVzIGByZXF1ZXN0ZWRgKS4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMvcmV2aXNpb25zKSBtdXN0IG1hdGNoXG4gKiBleGFjdGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UsIGRlcGVuZGVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gcmVxdWVzdGVkLmtpbmQpIHtcbiAgICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybjtcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuO1xuICAgIC8vIE9uY2UgdGhlIGNvbmNyZXRlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIGtub3duIChpbnN0YWxsZWQgY29weSBvciBleHRyYWN0ZWQgZG93bmxvYWQpLCBhXG4gICAgLy8gcmVxdWlyZW1lbnQgaXQgc2F0aXNmaWVzIGlzIGNvbXBhdGlibGUgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBzcGVjaWZpZXJzIGFyZSBub3Qgc3Vic2V0c1xuICAgIC8vIChlLmcuIGBeMS4wLjBgIHJlc29sdmVkIHRvIDEuMi4zIGFsc28gc2F0aXNmaWVzIGEgbGF0ZXIgZXhhY3QgYDEuMi4zYCkuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHN5bWxpbmtzIGluIHRoZSBkZWVwZXN0IEVYSVNUSU5HIGFuY2VzdG9yIG9mIHRoZSBwYXRoIGFuZCByZWF0dGFjaGVzIHRoZSBub3QteWV0XG4gKiBleGlzdGluZyByZW1haW5kZXIsIHNvIGxleGljYWwgY29udGFpbm1lbnQvb3ZlcmxhcCBjaGVja3Mgb3BlcmF0ZSBvbiBwaHlzaWNhbCBsb2NhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgY29uc3QgcmVtYWluZGVyU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhleGlzdGluZ1BhdGgpKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShleGlzdGluZ1BhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBleGlzdGluZ1BhdGgpIGJyZWFrO1xuICAgIHJlbWFpbmRlclNlZ21lbnRzLnVuc2hpZnQocGF0aC5iYXNlbmFtZShleGlzdGluZ1BhdGgpKTtcbiAgICBleGlzdGluZ1BhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMoZXhpc3RpbmdQYXRoKSwgLi4ucmVtYWluZGVyU2VnbWVudHMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRhcmdldFBhdGgpO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIHRoZSB0d28gcGF0aHMgYXJlIGVxdWFsIG9yIG9uZSBjb250YWlucyB0aGUgb3RoZXIuICovXG5mdW5jdGlvbiBwYXRoc092ZXJsYXAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhLCBiKSB8fCBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYiwgYSk7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhbmNlc3RvclBhdGg6IHN0cmluZywgZGVzY2VuZGFudFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFuY2VzdG9yUGF0aCwgZGVzY2VuZGFudFBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbGVkIG1hdGVyaWFsaXphdGlvbiBvZiBhIHJlZ2lzdHJ5IHBhY2thZ2UsIHdoZW4gaXRzIHZlcnNpb24gaXMgc3RhdGljYWxseSBrbm93biB0b1xuICogc2F0aXNmeSB0aGUgc3BlY2lmaWVyIOKAlCBzdGVwcyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIChlLmcuIENJIHRlc3Qgc3RlcHMsIHdoaWNoXG4gKiBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pIHJldXNlIGl0IGluc3RlYWQgb2YgZG93bmxvYWRpbmcuIFJldHVybnMgdW5kZWZpbmVkXG4gKiAoZmFsbGluZyBiYWNrIHRvIGEgZG93bmxvYWQpIHdoZW4gbm8gdW5hbWJpZ3VvdXNseSBjb3JyZWN0IGluc3RhbGxlZCBjb3B5IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlXG4pOiB7IGRpclBhdGg6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBzcGVjaWZpZXIgPSBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnO1xuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsIC4uLnByaXZhdGVQYWNrYWdlLm5hbWUuc3BsaXQoJy8nKSk7XG4gIGNvbnN0IGFkZENhbmRpZGF0ZSA9IChjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgaWYgKHZlcnNpb24gJiYgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXIsIHZlcnNpb24pKSBjYW5kaWRhdGVzLnNldChmcy5yZWFscGF0aFN5bmMoZGlyUGF0aCksIHZlcnNpb24pO1xuICB9O1xuICAvLyBBIHJvb3QtbGV2ZWwgaW5zdGFsbGF0aW9uIGlzIFRIRSBsb2NrZmlsZSByZXNvbHV0aW9uIGZvciB0aGUgcm9vdCBkZXBlbmRlbmN5OyB0aGUgLmJ1biBzdG9yZVxuICAvLyBpcyBjb25zdWx0ZWQgb25seSBmb3IgdHJhbnNpdGl2ZS1vbmx5IHBhY2thZ2VzLCB3aGVyZSBtdWx0aXBsZSBzYXRpc2Z5aW5nIHJlc29sdXRpb25zIG1heVxuICAvLyBjb2V4aXN0IGFuZCBwaWNraW5nIG9uZSBhcmJpdHJhcmlseSBjb3VsZCBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudC5cbiAgY29uc3QgZGlyZWN0Q2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENhbmRpZGF0ZShkaXJlY3RDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICBpZiAoZGlyZWN0Q2FuZGlkYXRlcy5zaXplID09PSAxKSByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcyk7XG5cbiAgY29uc3Qgc3RvcmVDYW5kaWRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGFkZENhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMsIHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJywgZGlyZW50Lm5hbWUsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICB9XG4gIHJldHVybiB0b1NpbmdsZUNhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMpO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUNhbmRpZGF0ZShjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW2VudHJ5XSA9IGNhbmRpZGF0ZXM7XG4gIHJldHVybiBjYW5kaWRhdGVzLnNpemUgPT09IDEgJiYgZW50cnkgPyB7IGRpclBhdGg6IGVudHJ5WzBdLCB2ZXJzaW9uOiBlbnRyeVsxXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkSW5zdGFsbGVkVmVyc2lvbihkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHR5cGVvZiBwYWNrYWdlSnNvbi52ZXJzaW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBwYWNrYWdlSnNvbi52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcml2YXRlUGFja2FnZVtdIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGNvbnN0IGlzR2l0ID0gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzR2l0ICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0dpdCAmJiAhbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShuYW1lKTtcbiAgICAgIC8vIERlcGVuZGVuY3kgbmFtZXMgYmVjb21lIGV4dGVybmFsIGRhdGEgb25jZSBuZXN0ZWQgbWFuaWZlc3RzIGNvbWUgZnJvbSBkb3dubG9hZGVkXG4gICAgICAvLyB0YXJiYWxsczsgcmVqZWN0IGFueXRoaW5nIChwYXRoIHNlcGFyYXRvcnMsIGAuLmAsIGhpZGRlbi1maWxlIHByZWZpeGVzKSB0aGF0IGNvdWxkXG4gICAgICAvLyBlc2NhcGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgdGhlIG5hbWUgaXMgam9pbmVkIGludG8gYmVmb3JlIGl0IGlzIHJlY3Vyc2l2ZWx5IGRlbGV0ZWQuXG4gICAgICBpZiAoIS9eW1xcdy4tXSskLy50ZXN0KHVuc2NvcGVkTmFtZSkgfHwgdW5zY29wZWROYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBwYWNrYWdlIG5hbWU6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGtpbmQ6IGlzR2l0ID8gJ2dpdCcgOiAncmVnaXN0cnknLFxuICAgICAgICBzb3VyY2VEaXJQYXRoOiB1bmRlZmluZWQsXG4gICAgICAgIHJlc29sdmVkVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gS2VlcCB0aGUgTkFSUk9XRVIgcmVxdWlyZW1lbnQg4oCUIGl0c1xuICogbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBzYXRpc2ZpZXMgdGhlIHdpZGVyIG9uZSBieSBkZWZpbml0aW9uIChhbiBleGFjdCBwaW4gaXMgdGhlIG5hcnJvd2VzdFxuICogcmFuZ2UpIOKAlCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGUgcmVxdWlyZW1lbnRzIGdlbnVpbmVseSBkaXZlcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgaWYgKG5hcnJvd2VyKSByZXR1cm4gbmFycm93ZXI7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciAke2V4aXN0aW5nLm5hbWV9IHdpdGhpbiBvbmUgbWFuaWZlc3Q6IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSB2cyAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS5gXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHJlcXVpcmVtZW50IHdob3NlIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSBvdGhlciAoYW4gZXhhY3RcbiAqIHBpbiBpcyB0aGUgbmFycm93ZXN0IHJhbmdlKSwgb3IgdW5kZWZpbmVkIHdoZW4gbmVpdGhlciBzdWJzdW1lcyB0aGUgb3RoZXIuXG4gKi9cbmZ1bmN0aW9uIG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KFxuICBleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsXG4gIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2Vcbik6IFByaXZhdGVQYWNrYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgIT09IHJlcXVlc3RlZC5raW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikpIHJldHVybiByZXF1ZXN0ZWQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBzdGFnaW5nUm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyh0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMil9XFxuYCwgJ3V0ZjgnKTtcbiAgICAgIC8vIFN0YWdpbmcgbWlycm9ycyB0aGUgcm9vdC1yZWxhdGl2ZSBsYXlvdXQsIHNvIHRoaXMgaXMgdGhlIG1hbmlmZXN0J3MgcG9zdC1zd2FwIGxvY2F0aW9uLlxuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShzdGFnaW5nUm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgLy8gQm90aCBzaWRlcyBhcmUgc3RhZ2VkIHBhdGhzOiBzdGFnaW5nIG1pcnJvcnMgdGhlIHJvb3QtcmVsYXRpdmUgbGF5b3V0LCBzbyB0aGUgcmVsYXRpdmVcbiAgICAgIC8vIHNwZWNpZmllciBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGUgZmluYWwgbG9jYXRpb25zIHdvdWxkIHByb2R1Y2UuXG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPVxuICAgICAgICBgZmlsZToke3BhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIHRvU3RhZ2VkUGF0aCh0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIE1vdmUgZXZlcnkgc3RhZ2VkIHRyZWUgb250byBpdHMgZmluYWwgbG9jYXRpb24gYXMgb25lIHRyYW5zYWN0aW9uOiBlYWNoIGxpdmUgdHJlZSBpcyBzZXQgYXNpZGVcbiAqIGZpcnN0IHNvIGEgZmFpbGluZyByZW5hbWUgY2FuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIGluc3RlYWQgb2YgbGVhdmluZyBvbmUgdHJlZSByZXBsYWNlZFxuICogYW5kIHRoZSBvdGhlciBzdGFsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhcbiAgb3V0RGlyUGF0aHM6IHN0cmluZ1tdLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgYmFja3VwUm9vdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgVU5JUVVFIGRpcmVjdG9yeSBwZXIgaW52b2NhdGlvbjogd2hlbiBhIHJvbGxiYWNrIGZhaWxzIGl0cyBiYWNrdXAgaXMgcmV0YWluZWQgZm9yIG1hbnVhbFxuICAvLyByZWNvdmVyeSwgYW5kIGEgZml4ZWQgcGF0aCB3b3VsZCBsZXQgdGhlIG5leHQgcnVuIGRlbGV0ZSB0aGUgb25seSByZW1haW5pbmcgY29weS5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGJhY2t1cFJvb3REaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGJhY2t1cERpclJvb3QgPSBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKGAke2JhY2t1cFJvb3REaXJQYXRofS1gKTtcbiAgLy8gUmVjb3JkZWQgQkVGT1JFIHRoZSBzdGFnZWQgdHJlZSBpcyByZW5hbWVkIGluOiBiZXR3ZWVuIHNldHRpbmcgdGhlIGxpdmUgdHJlZSBhc2lkZSBhbmRcbiAgLy8gaW5zdGFsbGluZyBpdHMgcmVwbGFjZW1lbnQgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbiBleGlzdHMgb25seSBpbiB0aGUgYmFja3VwLCBhbmQgYSByZWNvcmRcbiAgLy8gYWRkZWQgYWZ0ZXIgdGhlIHJlbmFtZSB3b3VsZCBsZWF2ZSB0aGF0IHdpbmRvdyB1bnJlY292ZXJhYmxlLlxuICBjb25zdCBzd2FwcGVkRGlyczogeyBvdXREaXJQYXRoOiBzdHJpbmc7IGJhY2t1cERpclBhdGg6IHN0cmluZzsgaGFkUHJldmlvdXNUcmVlOiBib29sZWFuIH1bXSA9IFtdO1xuICBsZXQgcmVzdG9yZUZhaWxlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBvdXREaXJQYXRoXSBvZiBvdXREaXJQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgIC8vIEluZGV4ZWQgKG5vdCBuYW1lZCBhZnRlciB0aGUgZGlyZWN0b3J5KSBzbyB0d28gb3V0cHV0IHRyZWVzIHNoYXJpbmcgYSBiYXNlbmFtZSBjYW5ub3RcbiAgICAgIC8vIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgYmFja3VwLlxuICAgICAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguam9pbihiYWNrdXBEaXJSb290LCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgIGNvbnN0IGhhZFByZXZpb3VzVHJlZSA9IGZzLmV4aXN0c1N5bmMob3V0RGlyUGF0aCk7XG4gICAgICBpZiAoaGFkUHJldmlvdXNUcmVlKSBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCk7XG4gICAgICBzd2FwcGVkRGlycy5wdXNoKHsgb3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCwgaGFkUHJldmlvdXNUcmVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0b1N0YWdlZFBhdGgob3V0RGlyUGF0aCksIG91dERpclBhdGgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXZlcnNlIG9yZGVyOiB1bmRvIHRoZSBtb3N0IHJlY2VudCBzd2FwIGZpcnN0LlxuICAgIGZvciAoY29uc3Qgc3dhcHBlZCBvZiBzd2FwcGVkRGlycy50b1JldmVyc2VkKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN3YXBwZWQub3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoc3dhcHBlZC5oYWRQcmV2aW91c1RyZWUpIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzd2FwcGVkLmJhY2t1cERpclBhdGgsIHN3YXBwZWQub3V0RGlyUGF0aCk7XG4gICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFJlcG9ydGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBtYXR0ZXJzIG1vcmUsIGJ1dCBhIGZhaWxlZCByb2xsYmFjayBsZWF2ZXMgdGhlIHRyZWVcbiAgICAgICAgLy8gbWlzc2luZywgc28gaXQgbXVzdCBub3QgcGFzcyBzaWxlbnRseSDigJQgYW5kIGl0cyBiYWNrdXAgaXMgdGhlbiB0aGUgT05MWSByZW1haW5pbmcgY29weS5cbiAgICAgICAgcmVzdG9yZUZhaWxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZXN0b3JlICR7c3dhcHBlZC5vdXREaXJQYXRofTogJHtTdHJpbmcocm9sbGJhY2tFcnJvcil9XFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uIGlzIGtlcHQgYXQgJHtzd2FwcGVkLmJhY2t1cERpclBhdGh9OyBtb3ZlIGl0IGJhY2sgYnkgaGFuZC5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbmx5IHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvIHJlY292ZXI6IGRlbGV0aW5nIHRoZSBiYWNrdXBzIGFmdGVyIGEgZmFpbGVkIHJlc3RvcmUgd291bGRcbiAgICAvLyBkZXN0cm95IHRoZSBsYXN0IGNvcHkgb2YgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbi4gQW5kIGJ5IHRoaXMgcG9pbnQgYm90aCB0cmVlcyBhcmVcbiAgICAvLyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gYSBjbGVhbnVwIGZhaWx1cmUgKGUuZy4gYSByZWFkLW9ubHkgZGlyZWN0b3J5IGBmcy5jcGAgcHJlc2VydmVkKSBtdXN0XG4gICAgLy8gbm90IHR1cm4gYSBzdWNjZXNzZnVsIG1hdGVyaWFsaXphdGlvbiBpbnRvIGEgcmVwb3J0ZWQgZmFpbHVyZS5cbiAgICBpZiAoIXJlc3RvcmVGYWlsZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGJhY2t1cERpclJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gcmVtb3ZlICR7YmFja3VwRGlyUm9vdH06ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RzLCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4vc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3Qgc3FsaXRlRmlsZVBhdHRlcm4gPSAvXFwuKD86c3FsaXRlMz98ZGIpKD86Wy0uXSg/OmpvdXJuYWx8c2htfHdhbCkpPyQvaTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXRocyA9IFtcbiAgJy5jYWNoZScsXG4gICcubXlweV9jYWNoZScsXG4gICcubmV4dC9jYWNoZScsXG4gICcucGFyY2VsLWNhY2hlJyxcbiAgJy5weXRlc3RfY2FjaGUnLFxuICAnLnJ1ZmZfY2FjaGUnLFxuICAnLnRveCcsXG4gICcudHVyYm8nLFxuICAnLnZlbnYnLFxuICAnLnlhcm4vY2FjaGUnLFxuICAnLnlhcm4vaW5zdGFsbC1zdGF0ZS5neicsXG4gICdfX3B5Y2FjaGVfXycsXG4gICdjb3ZlcmFnZScsXG4gICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgJ3BsYXl3cmlnaHQtcmVwb3J0JyxcbiAgJ3N0b3J5Ym9vay1zdGF0aWMnLFxuICAndGFyZ2V0JyxcbiAgJ3Rlc3QtcmVzdWx0cycsXG5dO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zID0gWycqKi8qLnB5YycsICcqKi8qLnRzYnVpbGRpbmZvJywgJyoqL19fcHljYWNoZV9fJ107XG5jb25zdCBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcyA9IFsncHJpc21hJywgJ2RiJywgJ2RyaXp6bGUnXSBhcyBjb25zdDtcbmNvbnN0IGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocyA9IFsnL2RhdGEnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBvbiB0aGUgaG9zdCBmaXJzdCBzbyB0aGUgcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyByZXNvbHZlc1xuICAgIC8vIHRoZW0gdG8gZmlsZTogcGF0aHMgYW5kIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMuIE9ubHkgaW4gLS1vdXRzaWRlXG4gICAgLy8gbW9kZSAodGhlIGluLWltYWdlIHNlY29uZCBwYXNzIGhhcyBubyBub2RlX21vZHVsZXMvcmVnaXN0cnkgdG8gbWF0ZXJpYWxpemUgZnJvbSkgYW5kIG9ubHlcbiAgICAvLyB3aGVuIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IGRlY2xhcmVkLCBzbyByZXBvcyB3aXRob3V0IG9uZSBhcmUgdW50b3VjaGVkIOKAlCBubyBlbXB0eVxuICAgIC8vIG91dHB1dCBkaXJlY3Rvcmllcywgbm8gc3B1cmlvdXMgXCJDT1BZXCIgaGludC4gRmFpbHVyZXMgYXJlIG5vbi1mYXRhbCBhbmQgbm9uLWRlc3RydWN0aXZlOlxuICAgIC8vIG1hdGVyaWFsaXplIHRocm93cyBiZWZvcmUgZGVsZXRpbmcgYW55IGV4aXN0aW5nIG91dHB1dCAoYW5kIGNsZWFucyB1cCBpdHMgc3RhZ2luZyBvbiBhIGZhaWxlZFxuICAgIC8vIGRvd25sb2FkKSwgc28gYSByZXBvIGxhY2tpbmcgcmVnaXN0cnkgY3JlZGVudGlhbHMga2VlcHMgYnVpbGRpbmcgZXhhY3RseSBhcyBiZWZvcmUsIHdpdGggdGhlXG4gICAgLy8gcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyBlbWl0dGluZyB0aGUgZXhpc3RpbmcgXCJydW4gd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1wiIGhpbnQuIFRoaXNcbiAgICAvLyBrZWVwcyB0aGUgc3RlcCBhIHB1cmUgY29udmVuaWVuY2UgdGhhdCBsZXRzIHJlcG9zaXRvcmllcyBkcm9wIHRoZSBleHBsaWNpdCBjb21tYW5kLlxuICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgd29ya3NwYWNlIHNldCBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3Qgc28gYSBwcml2YXRlIGRlcGVuZGVuY3kgZGVjbGFyZWQgaW5cbiAgICAgIC8vIGFueSBzaWJsaW5nIHdvcmtzcGFjZSBpcyBtYXRlcmlhbGl6ZWQgZXZlbiB3aGVuIG9wdGltaXplIHJ1bnMgZnJvbSBhIHN1YnBhY2thZ2UgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgcm9vdFByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0cyA9IGNvbGxlY3RNYW5pZmVzdHMocm9vdFByb2plY3RzID8/IHByb2plY3RzKTtcbiAgICAgIGlmIChtYW5pZmVzdHMuc29tZShkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgbWFuaWZlc3RzLCB7IGRyeVJ1bjogQm9vbGVhbihhcmd2LmRyeVJ1bikgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGF1dG8tbWF0ZXJpYWxpemUgcHJpdmF0ZSBwYWNrYWdlcyAoJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9KTsgYCArXG4gICAgICAgICAgICAgICAgJ3J1biBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgaWYgdGhlIERvY2tlciBidWlsZCBuZWVkcyB0aGVtLiBDb250aW51aW5nLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVkUHJvamVjdHM6IFByb2plY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0LCBwYWNrYWdlSnNvbik7XG4gICAgICBjb25zdCByZW1vdmVkRGV2RGVwZW5kZW5jaWVzID0gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24sIHtcbiAgICAgICAgcmVtb3ZlV2JQb3N0aW5zdGFsbDogIWFyZ3Yub3V0c2lkZSAmJiByZW1vdmVkRGV2RGVwZW5kZW5jaWVzLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvd2InKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgICAgb3B0aW1pemVkUHJvamVjdHMucHVzaChwcm9qZWN0KTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9qZWN0cy5yb290LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZCwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgICAgYXdhaXQgY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKG9wdGltaXplZFByb2plY3RzKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKiogV2hldGhlciBhbnkgZGVwZW5kZW5jeSBzZWN0aW9uIGRlY2xhcmVzIGEgcHJpdmF0ZSBnaXQgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHJlZ2lzdHJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiBkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzLnNvbWUoKGtleSkgPT4ge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIHJldHVybiAoXG4gICAgICBkZXBzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRlcHMpLnNvbWUoXG4gICAgICAgIChbbmFtZSwgdmFsdWVdKSA9PiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSB8fCBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb24pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJld3JpdHRlbkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICBpZiAoaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC4gT25seSB0aGUgb3JnJ3NcbiAgICAgICAgLy8gb3duIGdpdCBkZXBlbmRlbmNpZXMgYXJlIHJld3JpdHRlbiDigJQgdGhlIHNoYXJlZCBwcmVkaWNhdGUgbWF0Y2hlcyBleGFjdGx5IHdoYXRcbiAgICAgICAgLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcywgc28gb3RoZXIgU1NIIFVSTHMgYXJlIGxlZnQgdW5jaGFuZ2VkIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYmVpbmcgcG9pbnRlZCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgbG9jYWwgcGF0aHMuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsICdAd2lsbGJvb3N0ZXInLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxpemVkVmVyc2lvbiA9IHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aCwgbmFtZSk7XG4gICAgICAgIGlmIChtYXRlcmlhbGl6ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBMZWF2aW5nIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIgbWVhbnMgdGhlIGluLWltYWdlIGluc3RhbGwgbmVlZHMgVmVyZGFjY2lvXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMg4oCUIHRoZSBmYWlsdXJlIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gYXZvaWQg4oCUIHNvIHNheSBzbyBvdXQgbG91ZC5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGAke25hbWV9IGlzIG5vdCBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS87IHJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgIHNvIHRoZSBEb2NrZXIgYnVpbGQgZG9lcyBub3QgbmVlZCByZWdpc3RyeSBjcmVkZW50aWFscy5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gaXMgc3RhbGUgd2hlbiB0aGUgc3BlY2lmaWVyIChhbiBleGFjdCB2ZXJzaW9uIG9yIGFueSBzZW12ZXJcbiAgICAgICAgLy8gcmFuZ2UgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5KSBkb2VzXG4gICAgICAgIC8vIG5vdCBhZG1pdCBpdC4gRGlzdC10YWcgc3BlY2lmaWVycyAoZS5nLiBgMjAyNi1zdGFibGVgKSBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2suXG4gICAgICAgIGlmICghbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyh2YWx1ZSwgbWF0ZXJpYWxpemVkVmVyc2lvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgICBgTWF0ZXJpYWxpemVkICR7bmFtZX0gaXMgJHttYXRlcmlhbGl6ZWRWZXJzaW9ufSBidXQgcGFja2FnZS5qc29uIHJlcXVpcmVzICR7dmFsdWV9OyByZXJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB0aGF0IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZWQgb24gdGhlIGhvc3QgYXJlIHVzZWQgYXNcbiAgICAgICAgLy8gbG9jYWwgcGF0aHMgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gVmVyZGFjY2lvIGNyZWRlbnRpYWxzOyB0aGUgQ09NTUlUVEVEIHBhY2thZ2UuanNvblxuICAgICAgICAvLyBrZWVwcyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIOKAlCBvbmx5IHRoZSBnZW5lcmF0ZWQgKGRpc3QvKXBhY2thZ2UuanNvbiBpcyByZXdyaXR0ZW5cbiAgICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzOicsIHJld3JpdHRlbkRlcGVuZGVuY2llcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZXdyaXR0ZW5EZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzY29wZURpck5hbWU6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBzY29wZURpck5hbWUsIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZURpclBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBhbGlhc2VzOiBbJ2RiJ10sXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIGRhdGFiYXNlIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRHJpenpsZSBwcm9qZWN0cyB1c2UgZHJpenpsZS1raXQuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChnZW5lcmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnL2V0Yy9saXRlc3RyZWFtLnltbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyOiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoYWxsUHJvamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ3JlYXRpbmcgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBwcm9qZWN0cyBhdCBvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QsIG9ybSwgYXJndi5vdXRwdXQpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZ2VuZXJhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2dlbmVyYXRlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBPUk0gY2xpZW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZ2VuZXJhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5nZW5lcmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBjb25maWc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyOiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmxpc3RCYWNrdXBzKHByb2plY3QsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3QsIGFyZ3YuY2hlY2tJZGVtcG90ZW5jeSkpIHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3QpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgaWRlbXBvdGVuY3kgY2hlY2sgZm9yICR7cHJvamVjdC5uYW1lfSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LmApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdDogUHJvamVjdCwgY2hlY2tJZGVtcG90ZW5jeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJZGVtcG90ZW5jeSA/PyBpc0RvY2tlckVuYWJsZWQocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICdwcm9kdWN0aW9uJyk7XG59XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4ubGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxkcml6emxlfHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXJndi5vdXRwdXQgPz8gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdCwgb3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXN0b3JlKHByb2plY3QsIG91dHB1dCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSkpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICAvLyBSZXNvbHZlZCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBiZWNhdXNlIHByaXNtYVNjcmlwdHMuc3R1ZGlvIHJlc29sdmVzIGEgcmVsYXRpdmVcbiAgICAgIC8vIHBhdGggYWdhaW5zdCB0aGUgQ0xJIHByb2Nlc3MgZGlyZWN0b3J5LCB3aGljaCBkaWZmZXJzIGZvciB3b3Jrc3BhY2UgZGVzY2VuZGFudHMuXG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnByaXNtYURpck5hbWUsICdyZXN0b3JlZC5zcWxpdGUzJylcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgZnVsbENvbW1hbmQpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBjb21tYW5kKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBNYWtlIERyaXp6bGUgY29tbWFuZHMgd29yayBvbiBDbG91ZGZsYXJlIEQxIHByb2plY3RzIGJ5IHBvaW50aW5nIERBVEFCQVNFX1VSTFxuICogYXQgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2FsRDFJZk5lZWRlZChvcm06IERhdGFiYXNlT3JtLCBwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvcm0gPT09ICdkcml6emxlJyA/IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIHNjcmlwdCkgOiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSwgY29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdCwgb3JtKTtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgc25hcHNob3Q6XG4gIGludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgcmV0ZW50aW9uOiA3MmggIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzYDtcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBSYWlsd2F5IGluamVjdHMgaXRzIG93biBzeXN0ZW0gdmFyaWFibGVzIGFuZCBwbGF0Zm9ybS1tYW5hZ2VkIHZhbHVlczsgbmV2ZXIgbWlycm9yIHRob3NlIGJhY2ssXG4vLyBhbmQgc2tpcCBsb2NhbC1vbmx5IGtleXMuIEFwcCB2YXJpYWJsZXMgKGluY2x1ZGluZyBEQVRBQkFTRV9VUkwsIFBPUlQpIHN0YXkgZWxpZ2libGUgYmVjYXVzZVxuLy8gZm5veCBpcyB0aGUgc291cmNlIG9mIHRydXRoIOKAlCBhIHJlcG8gdGhhdCBtdXN0IE5PVCBvd24gYSB2YWx1ZSAoZS5nLiBhIFJhaWx3YXkgcmVmZXJlbmNlXG4vLyB2YXJpYWJsZSBwb2ludGluZyBhdCBhIGxpbmtlZCBkYXRhYmFzZSBzZXJ2aWNlKSBzaW1wbHkga2VlcHMgaXQgb3V0IG9mIGZub3guXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHZhcmlhYmxlcyB0byBwdXNoIHRvIFJhaWx3YXkgZnJvbSBhIHJlc29sdmVkIGVudmlyb25tZW50OiBkcm9wIGVtcHR5L3VuZGVmaW5lZCB2YWx1ZXNcbiAqIChzbyBhIGBLRVk9YCBwbGFjZWhvbGRlciBuZXZlciBibGFua3MgYSByZWFsIFJhaWx3YXkgdmFyaWFibGUpIGFuZCBSYWlsd2F5LW1hbmFnZWQga2V5cywgc29ydGVkXG4gKiBmb3IgYSBzdGFibGUgY29tbWFuZCBhbmQgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBbc3RyaW5nLCBzdHJpbmddW10ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWlzTm9uUmFpbHdheUtleShrZXkpO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBSYWlsd2F5RW52Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8UmFpbHdheUVudkNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHJhaWx3YXlFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdyYWlsd2F5LWVudicsXG4gIGRlc2NyaWJlOlxuICAgICdTeW5jIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVjbGFyZWQgZm9yIHRoZSBjdXJyZW50IFdCX0VOViAocmVzb2x2ZWQgZnJvbSBmbm94KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94IHNvdXJjZXM7IGlnbm9yZSBwcm9jZXNzLmVudiBzb1xuICAgIC8vIFJhaWx3YXkncyBvd24gaW5qZWN0ZWQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW4uIFRoZSBlZmZlY3RpdmUgdmFsdWVzIGNvbWUgZnJvbSBwcm9qZWN0LmVudlxuICAgIC8vIChmbm94LXJlc29sdmVkIGZvciBXQl9FTlYpLiBNaXJyb3JzIHdiIGRlcGxveS5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgUEFUSCBhbmRcbiAgICAvLyBDQVJHT19IT01FOyB0aG9zZSBtdXN0IG5ldmVyIGJlIHB1c2hlZCB0byBSYWlsd2F5LCBzbyBrZWVwIG9ubHkgZm5veC1kZWNsYXJlZCBrZXlzLlxuICAgIGNvbnN0IGZub3hLZXlzID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWZub3hLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICAvLyBFeHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2luIG92ZXIgY29uZmlndXJlZCB2YWx1ZXMgKG1hdGNoZXMgd2IgZGVwbG95IC8gZ2VuLWRldi12YXJzKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHN5bmMgdG8gUmFpbHdheS4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TmFtZXMgPSBlbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFdvdWxkIHN5bmMgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgUmFpbHdheSBDTEkgcmVhZHMgYXV0aCAoUkFJTFdBWV9BUElfVE9LRU4pIGFuZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudDsgcGFzcyB0aGVcbiAgICAvLyBwcm9qZWN0L3NlcnZpY2UvZW52aXJvbm1lbnQgZXhwbGljaXRseSB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29tbWFuZCB3b3JrcyB1bmF0dGVuZGVkIGluIENJLlxuICAgIGNvbnN0IGNvbnRleHRBcmdzOiBzdHJpbmdbXSA9IFsnLS1za2lwLWRlcGxveXMnXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9QUk9KRUNUX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXByb2plY3Q9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUR9YCk7XG4gICAgaWYgKHByb2Nlc3MuZW52LlJBSUxXQVlfU0VSVklDRV9JRCkgY29udGV4dEFyZ3MucHVzaChgLS1zZXJ2aWNlPSR7cHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEfWApO1xuICAgIGNvbnRleHRBcmdzLnB1c2goYC0tZW52aXJvbm1lbnQ9JHtlbnZOYW1lfWApO1xuICAgIGNvbnN0IHNldEFyZ3MgPSBlbnRyaWVzLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gWyctLXNldCcsIGAke2tleX09JHt2YWx1ZX1gXSk7XG5cbiAgICAvLyBzdGRpbzogJ3BpcGUnIGtlZXBzIHRoZSBSYWlsd2F5IENMSSdzIHZhcmlhYmxlIGxpc3RpbmcgKHdoaWNoIGVjaG9lcyB2YWx1ZXMpIG91dCBvZiBDSSBsb2dzO1xuICAgIC8vIHRoaXMgY29tbWFuZCBvbmx5IGV2ZXIgcHJpbnRzIGtleSBuYW1lcywgbmV2ZXIgdmFsdWVzLlxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ2J1bngnLCBbJ0ByYWlsd2F5L2NsaScsICd2YXJpYWJsZXMnLCAuLi5jb250ZXh0QXJncywgLi4uc2V0QXJnc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byBzeW5jIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBSYWlsd2F5IChleGl0ICR7cmV0LnN0YXR1c30pLiBLZXlzOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTeW5jZWQgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG50eXBlIFJlbGVhc2VBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIGFyZ3M/OiB1bmtub3duW107XG4gICctLSc/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgY29uc3QgcmVsZWFzZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdyZWxlYXNlIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgJ1J1biBzZW1hbnRpYy1yZWxlYXNlIChvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlKSBzbyB0aGF0IHJlcG9zaXRvcmllcyB1c2luZyBCdW4gaXNvbGF0ZWQgaW5zdGFsbHMgY2FuIHB1Ymxpc2ggdG8gbnBtOiAnICtcbiAgICBcInJlaW5zdGFsbCB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciAobnBtIGNhbm5vdCB3YWxrIEJ1bidzIGlzb2xhdGVkIG5vZGVfbW9kdWxlcyBsYXlvdXQpLCBcIiArXG4gICAgJ3Jld3JpdGUgYHdvcmtzcGFjZTpgIHJhbmdlcyBucG0gY2Fubm90IHBhcnNlLCBydW4gdGhlIHJlbGVhc2UsIHRoZW4gcmVzdG9yZSB0aGUgbW9kaWZpZWQgZmlsZXMuICcgK1xuICAgICdFeHRyYSBhcmd1bWVudHMgKGUuZy4gYC0tZGVidWdgLCBhZnRlciBgLS1gKSBhcmUgZm9yd2FyZGVkIHRvIHRoZSByZWxlYXNlIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCByZWxlYXNlKGFyZ3YgYXMgUmVsZWFzZUFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2UoYXJndjogUmVsZWFzZUFyZ3YsIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBzZW1hbnRpYy1yZWxlYXNlIG11c3QgcnVuIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGl0IHJlYWRzIHRoZSBnaXQgcmVwbyBhbmQsIGZvciBtb25vcmVwb3MsXG4gIC8vIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugd2Fsa3MgdGhlIHdvcmtzcGFjZXMgaXRzZWxmLlxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMucm9vdDtcblxuICAvLyBNYXBzIGEgbXV0YXRlZCBmaWxlIHRvIGl0cyBwcmUtcmVsZWFzZSBjb250ZW50IChyYXcgYnl0ZXMg4oCUIGJ1bi5sb2NrYiBpcyBiaW5hcnkpOyBgdW5kZWZpbmVkYFxuICAvLyBtYXJrcyBhIGZpbGUgdGhhdCBkaWQgbm90IGV4aXN0IGFuZCBtdXN0IGJlIGRlbGV0ZWQgb24gcmVzdG9yZSAoZS5nLiBhIGNyZWF0ZWQgbG9ja2ZpbGUpLlxuICBjb25zdCBtb2RpZmllZEZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4oKTtcbiAgLy8gV2l0aCBhIGhhbmRsZXIgaW5zdGFsbGVkLCBTSUdJTlQvU0lHVEVSTSBubyBsb25nZXIgdGVybWluYXRlIHRoaXMgcHJvY2Vzcywgc28gdGhlXG4gIC8vIGZpbmFsbHktcmVzdG9yZSBhbHdheXMgZXhlY3V0ZXMgYW5kIHRoZSBzaWduYWwgaXMgcmUtcmFpc2VkIGFmdGVyd2FyZHMuIFRoZSBoYW5kbGVyIGFsc29cbiAgLy8gRk9SV0FSRFMgdGhlIHNpZ25hbCB0byB0aGUgcnVubmluZyBjaGlsZDogY2hpbGRyZW4gYXJlIHNwYXduZWQgYXN5bmNocm9ub3VzbHkgKG5ldmVyXG4gIC8vIHNwYXduU3luYywgd2hpY2ggd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AgYW5kIGRlZmVyIHRoZSBoYW5kbGVyIHVudGlsIGFmdGVyIHRoZSBjaGlsZCDigJRcbiAgLy8gYW5kIGEgcHVibGlzaCDigJQgY29tcGxldGVkKSwgc28gYSBzaWduYWwgdGFyZ2V0ZWQgYXQgdGhpcyBwcm9jZXNzIGFsb25lIHN0aWxsIGNhbmNlbHMgdGhlXG4gIC8vIGNoaWxkIHByb21wdGx5LlxuICBsZXQgcmVjZWl2ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBjb25zdCBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYgPSB7IGN1cnJlbnQ6IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzaWduYWxIYW5kbGVyID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICByZWNlaXZlZFNpZ25hbCA9IHNpZ25hbDtcbiAgICAvLyB0cmVlS2lsbCAobm90IGNoaWxkLmtpbGwpOiBzZW1hbnRpYy1yZWxlYXNlIGFuZCBidW4gaW5zdGFsbCBzcGF3biB0aGVpciBvd24gc3VicHJvY2Vzc2VzXG4gICAgLy8gKG5wbSBwdWJsaXNoLCBnaXQgcHVzaCwgLi4uKSwgd2hpY2ggbXVzdCBub3Qga2VlcCBwdWJsaXNoaW5nIGFmdGVyIHdiIHJlcG9ydHMgY2FuY2VsbGF0aW9uLlxuICAgIC8vIHRyZWVLaWxsIFRIUk9XUyAobWlzc2luZy90aW1pbmctb3V0IGBwc2AsIEVQRVJNKSwgYW5kIGFuIGV4Y2VwdGlvbiBlc2NhcGluZyBhIHNpZ25hbFxuICAgIC8vIGxpc3RlbmVyIHdvdWxkIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhbmQgc2tpcCB0aGUgcmVzdG9yaW5nIGZpbmFsbHkg4oCUIHNvIGRlZ3JhZGUgdG9cbiAgICAvLyBraWxsaW5nIHRoZSBkaXJlY3QgY2hpbGQgaW5zdGVhZC5cbiAgICB0cnkge1xuICAgICAgaWYgKGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LnBpZCkgdHJlZUtpbGwoYWN0aXZlQ2hpbGQuY3VycmVudC5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gdGVybWluYXRlIHRoZSByZWxlYXNlIGNoaWxkIHByb2Nlc3MgdHJlZTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGd1YXJkZWRTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID0gWydTSUdJTlQnLCAnU0lHVEVSTSddO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuXG4gIGxldCBleGl0Q29kZSA9IDA7XG4gIGxldCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IHJlbGVhc2VQdWJsaXNoZXNUb05wbShwcm9qZWN0KSkge1xuICAgICAgYXdhaXQgcHJlcGFyZU5wbUNvbXBhdGlibGVMYXlvdXQocHJvamVjdCwgYXJndiwgbW9kaWZpZWRGaWxlcywgYWN0aXZlQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgYW5kIHdvcmtzcGFjZS1yYW5nZSByZXdyaXRlIGV4aXN0IHNvbGVseSBzbyBucG0gKHdoaWNoIHRoZVxuICAgICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW4gZGlnZXN0IHRoZSBjaGVja291dDsgd2l0aG91dCB0aGF0IHBsdWdpblxuICAgICAgLy8gdGhlIHJlbGVhc2UgcnVucyBkaXJlY3RseSBvbiB0aGUgaXNvbGF0ZWQgbGF5b3V0IChpc3N1ZSAjMTAwMCkuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgJ1NraXBwaW5nIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBiZWNhdXNlIHRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaW5jbHVkZSBAc2VtYW50aWMtcmVsZWFzZS9ucG0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBBIHNpZ25hbCBtYXkgaGF2ZSBhcnJpdmVkIGJldHdlZW4gY2hpbGRyZW4gKG5vdGhpbmcgdG8gZm9yd2FyZCB0byBhdCB0aGF0IGluc3RhbnQpLCBzbyBpdFxuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnl0aGluZyBwdWJsaXNoZXMuXG4gICAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFib3J0ZWQgYnkgJHtyZWNlaXZlZFNpZ25hbH0gYmVmb3JlIHJ1bm5pbmcgdGhlIHJlbGVhc2UuYCk7XG4gICAgfVxuICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3QsIGFyZ3YsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBSZWNvcmRlZCBzZXBhcmF0ZWx5IGZyb20gcmVjZWl2ZWRTaWduYWw6IGEgc2lnbmFsIGFycml2aW5nIEFGVEVSIGEgc3VjY2Vzc2Z1bCBwdWJsaXNoIG11c3RcbiAgICAvLyBub3QgZGVtb3RlIHRoZSByZXN0b3JlIHRvIGJ5dGUtZm9yLWJ5dGUgKHRoYXQgd291bGQgcmV2ZXJ0IHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBidW1wcykuXG4gICAgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEVycm9ycyBtdXN0IHVud2luZCB0aHJvdWdoIHRoaXMgdHJ5IChuZXZlciBgcHJvY2Vzcy5leGl0YCBpbnNpZGUgaXQpOiB0aGUgcmVzdG9yZSBiZWxvdyBpc1xuICAgIC8vIHRoZSBvbmx5IHRoaW5nIHRoYXQgdW5kb2VzIHRoZSBidW5maWcvcGFja2FnZS5qc29uIG11dGF0aW9ucy5cbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICBleGl0Q29kZSA9IDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT24gZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24sIHJlc3RvcmUgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSBtYXkgaGF2ZSBsZWZ0IFBBUlRJQUxcbiAgICAvLyBlZGl0cyAoZS5nLiBhIHZlcnNpb24gYnVtcCB3aXRob3V0IGEgcHVibGlzaCksIHdoaWNoIG11c3Qgbm90IHN1cnZpdmUuIFRoZSBzZW1hbnRpY1xuICAgIC8vIHdvcmtzcGFjZS1yYW5nZSByZXN0b3JlIGlzIHJlc2VydmVkIGZvciBhIHN1Y2Nlc3NmdWwgcmVsZWFzZS5cbiAgICBjb25zdCByZXN0b3JlZEZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgbW9kaWZpZWRGaWxlcykge1xuICAgICAgaWYgKHJlc3RvcmVNb2RpZmllZEZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkpKSByZXN0b3JlZEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKHJlc3RvcmVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgUmVzdG9yZWQgJHtyZXN0b3JlZEZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwKSkuam9pbignLCAnKX0uYClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBoaW50IGFwcGxpZXMgb25seSB3aGVuIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBhY3R1YWxseSByYW47IGJ1bmZpZy50b21sIGlzIHNuYXBzaG90dGVkXG4gICAgLy8gZXhhY3RseSBpbiB0aGF0IGJyYW5jaC5cbiAgICBjb25zdCByZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyID0gWy4uLm1vZGlmaWVkRmlsZXMua2V5cygpXS5zb21lKFxuICAgICAgKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2J1bmZpZy50b21sJ1xuICAgICk7XG4gICAgaWYgKHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgJiYgIWlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzIG5vdyB1c2VzIHRoZSBob2lzdGVkIGxheW91dDsgcnVuIGEgY2xlYW4gcmVpbnN0YWxsIChgcm0gLXJmIG5vZGVfbW9kdWxlcyBwYWNrYWdlcy8qL25vZGVfbW9kdWxlcyAmJiBidW4gaW5zdGFsbGApIHRvIHJlc3RvcmUgdGhlIGlzb2xhdGVkIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9mZihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaWduYWwpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVDaGlsZFJlZiB7XG4gIGN1cnJlbnQ6IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwYXduIGFzeW5jaHJvbm91c2x5IGFuZCBhd2FpdCB0aGUgZXhpdCBzdGF0dXMuIFRoZSBldmVudCBsb29wIHN0YXlzIGZyZWUsIHNvIHBhcmVudC1vbmx5XG4gKiBzaWduYWxzIGFyZSBoYW5kbGVkIHByb21wdGx5IGFuZCBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkIGJ5IHJlbGVhc2UoKSdzIHNpZ25hbCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBzcGF3bkFuZFdhaXQoXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogY2hpbGRfcHJvY2Vzcy5TcGF3bk9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IpKSk7XG4gICAgICByZXNvbHZlKDEpO1xuICAgIH0pO1xuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2UgY2FuIHB1Ymxpc2ggdG8gbnBtLiBUcnVlIHVubGVzcyBhIHBsdWdpbiBsaXN0IGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZFxuICogKGluIGEgSlNPTi1wYXJzZWFibGUgc291cmNlKSBhbmQgb21pdHMgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgZXZlcnl3aGVyZSBpbiBzY29wZSDigJQgdGhlIHJvb3RcbiAqIGFuZCwgZm9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UgbW9ub3JlcG9zLCBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlIChhIHBhY2thZ2UtbGV2ZWwgcGx1Z2luIGxpc3RcbiAqIG92ZXJyaWRlcyB0aGUgcm9vdCdzKS4gc2VtYW50aWMtcmVsZWFzZSdzIERFRkFVTFQgcGx1Z2luIGxpc3QgaW5jbHVkZXMgdGhlIG5wbSBwbHVnaW4sIHNvIGFcbiAqIG1pc3NpbmcgcGx1Z2luIGxpc3QsIGEgbm9uLUpTT04gY29uZmlnIGZpbGUsIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgY29uc2VydmF0aXZlbHkga2VlcHMgdGhlXG4gKiBucG0gcHJlcGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlUHVibGlzaGVzVG9OcG0oXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvb3RQbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3QucGFja2FnZUpzb24pO1xuICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJvb3QgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgKG5wbSBpbmNsdWRlZCkgYXBwbGllcy5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHJvb3RQbHVnaW5zKSB8fCBwbHVnaW5zSW5jbHVkZU5wbShyb290UGx1Z2lucykpIHJldHVybiB0cnVlO1xuXG4gIGZvciAoY29uc3QgcGFja2FnZURpclBhdGggb2YgYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMocGFja2FnZURpclBhdGgsIHVuZGVmaW5lZCk7XG4gICAgLy8gQSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRob3V0IGl0cyBvd24gcGx1Z2luIGxpc3QgaW5oZXJpdHMgdGhlIHJvb3QncyAobnBtLWZyZWUpIGRlY2lzaW9uLlxuICAgIGlmIChwbHVnaW5zID09PSAndW5rbm93bicgfHwgKEFycmF5LmlzQXJyYXkocGx1Z2lucykgJiYgcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2lucykpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNJbmNsdWRlTnBtKHBsdWdpbnM6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGx1Z2lucy5zb21lKChwbHVnaW4pID0+IChBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW5bMF0gOiBwbHVnaW4pID09PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJyk7XG59XG5cbi8qKlxuICogY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzIG9yZGVyIGZvciBtb2R1bGUgXCJyZWxlYXNlXCIgKHdoYXQgc2VtYW50aWMtcmVsZWFzZSAyNVxuICogZGVsZWdhdGVzIHRvKSwgbWludXMgdGhlIGxlYWRpbmcgcGFja2FnZS5qc29uIGVudHJ5LCB3aGljaCB0aGUgY2FsbGVyIGNoZWNrcyBmaXJzdC4gVGhlIEZJUlNUXG4gKiBleGlzdGluZyBwbGFjZSB3aW5zOyBwbGFjZXMgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgbWFrZSB0aGUgZWZmZWN0aXZlIHBsdWdpblxuICogbGlzdCAndW5rbm93bicuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5mdW5jdGlvbiByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZFxuKTogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgJ3Vua25vd24nIHtcbiAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlOyBhIG1pc3Npbmcgb3JcbiAgLy8gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24ganVzdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBmaWxlIHNlYXJjaCBwbGFjZXMuXG4gIGlmIChwYWNrYWdlSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYWNrYWdlSnNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgbGV0IGNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiB7IHBsdWdpbnM/OiB1bmtub3duOyBleHRlbmRzPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZWxlYXNlO1xuICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSBjb250aW51ZTtcbiAgICAgIGlmICghanNvblBhcnNlYWJsZSkgcmV0dXJuICd1bmtub3duJztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpIGFzIHR5cGVvZiBjb25maWc7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnBsdWdpbnMpKSByZXR1cm4gY29uZmlnLnBsdWdpbnM7XG4gIC8vIEFuIGBleHRlbmRzYCBwcmVzZXQgbWF5IGNvbnRyaWJ1dGUgaXRzIG93biBwbHVnaW4gbGlzdCwgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHkuXG4gIHJldHVybiBjb25maWcuZXh0ZW5kcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGNoZWNrb3V0IGRpZ2VzdGlibGUgZm9yIG5wbSwgd2hpY2ggc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0byBmb3JcbiAqIGBucG0gdmVyc2lvbmAgLyBgbnBtIHB1Ymxpc2hgOlxuICogMS4gbnBtJ3MgYXJib3Jpc3QgY2Fubm90IHdhbGsgQnVuJ3MgSVNPTEFURUQgbm9kZV9tb2R1bGVzIGxheW91dCAodGhlIGAuYnVuYCBzeW1saW5rIGZhcm0pLCBzb1xuICogICAgY2xlYW4tcmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIGZpcnN0LiBBIG5vbi1jbGVhbiBsaW5rZXIgc3dpdGNoIHdvdWxkIGxlYXZlIHN0YWxlXG4gKiAgICBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVoaW5kIChwYWNrYWdlcyB0aGVuIHJlc29sdmUgZnJvbSB+Ly5idW4vaW5zdGFsbC9jYWNoZS9saW5rcyB3aGVyZVxuICogICAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgYXJlIHVucmVhY2hhYmxlKSwgc28gZXZlcnkgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyB3aXBlZCBmaXJzdC5cbiAqIDIuIG5wbSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlIEJ1biBSRVFVSVJFUyB0aGUgcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGxcbiAqICAgIGxpbmtzIHRoZSB3b3Jrc3BhY2Ug4oCUIHNvIHJld3JpdGUgdGhlIHJhbmdlcyB0byBgKmAgQUZURVIgdGhlIHJlaW5zdGFsbCAoQnVuIG11c3Qgc3RpbGwgc2VlXG4gKiAgICB0aGUgcHJvdG9jb2wgd2hpbGUgaW5zdGFsbGluZzsgbnBtIG9ubHkgbmVlZHMgdGhlIG1hbmlmZXN0IFRFWFQgdG8gYmUgcGFyc2VhYmxlKS4gVGhlXG4gKiAgICBhZmZlY3RlZCBtYW5pZmVzdHMgYXJlIHByaXZhdGUvdW5wdWJsaXNoZWQgb3IgcmV3cml0dGVuIGJ5IHRoZSBucG0gcGx1Z2luIG9uIHB1Ymxpc2guXG4gKiBBbGwgbXV0YXRpb25zIGFyZSByZXN0b3JlZCBieSB0aGUgY2FsbGVyIGFmdGVyIHRoZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUmVsZWFzZUFyZ3YsXG4gIG1vZGlmaWVkRmlsZXM6IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4sXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJ1bmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgY29uc3QgYnVuZmlnID0gZnMuZXhpc3RzU3luYyhidW5maWdQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhidW5maWdQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCBob2lzdGVkQnVuZmlnID0gYnVuZmlnID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnKTtcbiAgaWYgKGJ1bmZpZyAhPT0gdW5kZWZpbmVkICYmIGhvaXN0ZWRCdW5maWcgIT09IGJ1bmZpZykge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKCdDbGVhbi1yZWluc3RhbGxpbmcgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgc28gbnBtIGNhbiB3YWxrIG5vZGVfbW9kdWxlcy4uLicpKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChidW5maWdQYXRoLCBCdWZmZXIuZnJvbShidW5maWcsICd1dGY4JykpO1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIG1heSByZXdyaXRlIChvciBjcmVhdGUpIHRoZSBsb2NrZmlsZTsgc25hcHNob3QgdGhlIHJhdyBieXRlcyBzbyBhXG4gICAgICAvLyBzdWNjZXNzZnVsIHJlbGVhc2UgbGVhdmVzIG5vIHRyYWNrZWQgb3IgdW50cmFja2VkIGxvY2tmaWxlIGNoYW5nZXMgYmVoaW5kLlxuICAgICAgZm9yIChjb25zdCBsb2NrRmlsZU5hbWUgb2YgWydidW4ubG9jaycsICdidW4ubG9ja2InXSkge1xuICAgICAgICBjb25zdCBsb2NrRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBsb2NrRmlsZU5hbWUpO1xuICAgICAgICBtb2RpZmllZEZpbGVzLnNldChsb2NrRmlsZVBhdGgsIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoYnVuZmlnUGF0aCwgaG9pc3RlZEJ1bmZpZyA/PyAnJywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBbcHJvamVjdC5kaXJQYXRoLCAuLi4oYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKV0ubWFwKChkaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLmpvaW4oZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICAvLyBSZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGxpZmVjeWNsZSBzY3JpcHRzIERJU0FCTEVEIHdoaWxlIHRoZSByZWxlYXNlIGNyZWRlbnRpYWxzXG4gICAgICAvLyAoVkVSREFDQ0lPX1RPS0VOLCBOUE1fVE9LRU4sIEdJVEhVQl9UT0tFTiwgRk5PWF9BR0VfS0VZLCAuLi4pIGFyZSBpbiB0aGUgZW52aXJvbm1lbnQsXG4gICAgICAvLyBzbyByZXBvc2l0b3J5LSBvciBkZXBlbmRlbmN5LWRlZmluZWQgcHJlaW5zdGFsbC9wb3N0aW5zdGFsbCBjYW4gbmV2ZXIgcmVhZCB0aGVtIOKAlFxuICAgICAgLy8gbWlycm9yaW5nIHJldXNhYmxlLXdvcmtmbG93cycgdHdvLXN0ZXAgcmVsZWFzZSBpbnN0YWxsIChpc3N1ZSAjMTAwMykuXG4gICAgICBjb25zdCBpbnN0YWxsU3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJywgJy0taWdub3JlLXNjcmlwdHMnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGluc3RhbGxTdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gVGhyb3dpbmcgKGluc3RlYWQgb2YgcHJvY2Vzcy5leGl0LCB3aGljaCB3b3VsZCBza2lwIHRoZSBjYWxsZXIncyBmaW5hbGx5KSBsZXRzIHRoZVxuICAgICAgICAvLyByZXN0b3JlIHJ1biBiZWZvcmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcHJlcGFyaW5nIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGF5IHRoZSBza2lwcGVkIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgY3JlZGVudGlhbC1zY3J1YmJlZCBlbnZpcm9ubWVudC4gQSByZXBlYXRlZFxuICAgICAgLy8gYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgZG9lcyBub3QgcmVwbGF5IHRoZW0sIHNvIG5vZGVfbW9kdWxlcyBpcyB3aXBlZCBhZ2FpbjtcbiAgICAgIC8vIGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbiBidW4ncyBjYWNoZSBmcm9tIHRoZSBjcmVkZW50aWFsZWQgc3RlcCwgc28gdGhpcyByZS1saW5rXG4gICAgICAvLyBuZWVkcyBubyByZWdpc3RyeSBjcmVkZW50aWFscy5cbiAgICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRoIG9mIG5vZGVNb2R1bGVzRGlyUGF0aHMpIHtcbiAgICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbGF5U3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgIGVudjogYnVpbGRDcmVkZW50aWFsRnJlZUVudihwcm9qZWN0LmVudiksXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXBsYXlTdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcmVwbGF5aW5nIGxpZmVjeWNsZSBzY3JpcHRzIGZvciB0aGUgcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlycyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgW1xuICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLFxuICAgIC4uLndvcmtzcGFjZVBhY2thZ2VEaXJzLm1hcCgoZGlyUGF0aCkgPT4gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gIF0pIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgLy8gU25hcHNob3QgRVZFUlkgbWFuaWZlc3QgKG5vdCBvbmx5IHJld3JpdHRlbiBvbmVzKTogc2VtYW50aWMtcmVsZWFzZSBhbHNvIGVkaXRzIG1hbmlmZXN0c1xuICAgIC8vIHdpdGhvdXQgd29ya3NwYWNlOiByYW5nZXMgKHZlcnNpb24gYnVtcHMpLCBhbmQgYSBmYWlsZWQgcmVsZWFzZSBtdXN0IHJlc3RvcmUgdGhvc2UgdG9vLlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KHBhY2thZ2VKc29uUGF0aCwgQnVmZmVyLmZyb20ob3JpZ2luYWwsICd1dGY4JykpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKG9yaWdpbmFsKTtcbiAgICBpZiAocmV3cml0dGVuID09PSBvcmlnaW5hbCkgY29udGludWU7XG5cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUmV3cml0aW5nIHdvcmtzcGFjZTogcmFuZ2VzIGluICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9Li4uYCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCByZXdyaXR0ZW4sICd1dGY4Jyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBjcmVkZW50aWFscyB0aGUgcmVsZWFzZSB3b3JrZmxvdyBpbmplY3RzIChjZi4gcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlLnltbCBzZWNyZXRzIGFuZFxuLy8gbnBtJ3Mgb3duIHRva2VuIHZhcmlhYmxlcykuIFRoZSByZWxlYXNlIGNvbW1hbmQgbG9hZHMgdGhlIHByb2plY3Qgd2l0aCBsb2FkRW52OiBmYWxzZSwgc28gbm9cbi8vIHdiLWxvYWRlci1pbmplY3RlZCBrZXlzIGV4aXN0IHRvIHNjcnViIGJleW9uZCB0aGVzZS4gQSBkZW55bGlzdCAobm90IGFuIGFsbG93bGlzdCkgaXNcbi8vIGRlbGliZXJhdGU6IGluIHRoZSBzdXBwb3J0ZWQgZW50cnkgcG9pbnQg4oCUIHJldXNhYmxlLXdvcmtmbG93cycgcmVsZWFzZSBqb2Ig4oCUIHRoZXNlIGVudW1lcmF0ZWRcbi8vIHZhcmlhYmxlcyBhcmUgdGhlIE9OTFkgc2VjcmV0cyBpbiB0aGUgYW1iaWVudCBlbnZpcm9ubWVudCAoZm5veCBzZWNyZXRzIHN0YXkgZW5jcnlwdGVkIGJlY2F1c2Vcbi8vIEZOT1hfQUdFX0tFWSBpcyBzY3J1YmJlZCBhbmQgbmV2ZXIgZXhwb3J0ZWQgYXMgcGxhaW50ZXh0IHRoZXJlKSwgd2hpbGUgYW4gYWxsb3dsaXN0IHdvdWxkXG4vLyBicmVhayBsaWZlY3ljbGUgc2NyaXB0cyB0aGF0IGxlZ2l0aW1hdGVseSByZWFkIG9wZXJhdGlvbmFsIHZhcmlhYmxlcyAoUEFUSCwgSE9NRSwgQ0ksIC4uLikuXG4vLyBBIGxvY2FsIGB3YiByZWxlYXNlYCBpbmhlcml0cyB3aGF0ZXZlciB0aGUgZGV2ZWxvcGVyJ3Mgc2hlbGwgYWxyZWFkeSBleHBvc2VzIHRvIGV2ZXJ5XG4vLyBgYnVuIGluc3RhbGxgLCB3aGljaCB0aGlzIHJlcGxheSBkb2VzIG5vdCB3aWRlbi5cbmNvbnN0IGNyZWRlbnRpYWxFbnZWYXJOYW1lcyA9IFtcbiAgJ1ZFUkRBQ0NJT19UT0tFTicsXG4gICdOUE1fVE9LRU4nLFxuICAnTk9ERV9BVVRIX1RPS0VOJyxcbiAgJ0dJVEhVQl9UT0tFTicsXG4gICdHSF9UT0tFTicsXG4gICdHSF9QQUNLQUdFU19UT0tFTicsXG4gICdHSF9QS0dfUkVBRF9UT0tFTicsXG4gICdGTk9YX0FHRV9LRVknLFxuXTtcblxuLyoqXG4gKiBBIGNvcHkgb2YgYGVudmAgc2FmZSB0byBleHBvc2UgdG8gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cy4gQ3JlZGVudGlhbCB2YXJpYWJsZXMgYXJlXG4gKiBFTVBUSUVEIHJhdGhlciB0aGFuIGRlbGV0ZWQgc28gYCR7VkVSREFDQ0lPX1RPS0VOfWAtc3R5bGUgcmVmZXJlbmNlcyBpbiAubnBtcmMga2VlcCBleHBhbmRpbmdcbiAqIHRvICcnIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGluc3RhbGwgKHRoZSBwYXR0ZXJuIHJldXNhYmxlLXdvcmtmbG93cyByZWxpZXMgb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsRnJlZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2NydWJiZWRFbnYgPSB7IC4uLmVudiB9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY3JlZGVudGlhbEVudlZhck5hbWVzKSB7XG4gICAgaWYgKG5hbWUgaW4gc2NydWJiZWRFbnYpIHNjcnViYmVkRW52W25hbWVdID0gJyc7XG4gIH1cbiAgcmV0dXJuIHNjcnViYmVkRW52O1xufVxuXG4vKipcbiAqIFVuZG8gdGhlIHRlbXBvcmFyeSByZWxlYXNlLXRpbWUgbXV0YXRpb25zIG9mIG9uZSBmaWxlLiBgcGFja2FnZS5qc29uYCBmaWxlcyBhcmUgcmVzdG9yZWRcbiAqIHNlbWFudGljYWxseSBpbnN0ZWFkIG9mIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHdyaXRlcyB0aGUgcmVsZWFzZWRcbiAqIHZlcnNpb24gaW50byBtYW5pZmVzdHMgd2hpbGUgdGhleSBob2xkIHRoZSByZXdyaXR0ZW4gcmFuZ2VzLCBhbmQgYSBieXRlIHJlc3RvcmUgd291bGQgc2lsZW50bHlcbiAqIHJldmVydCB0aGF0IGJ1bXAg4oCUIHNvIHdoZW4gdGhlIGZpbGUgY2hhbmdlZCBkdXJpbmcgdGhlIHJlbGVhc2UsIG9ubHkgdGhlIGB3b3Jrc3BhY2U6YFxuICogc3BlY2lmaWVycyBhcmUgd3JpdHRlbiBiYWNrIGludG8gdGhlIENVUlJFTlQgY29udGVudC5cbiAqL1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgb24tZGlzayBjb250ZW50IGFjdHVhbGx5IGNoYW5nZWQgKGRyaXZlcyB0aGUgXCJSZXN0b3JlZCAuLi5cIiBtZXNzYWdlKS4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVNb2RpZmllZEZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogQnVmZmVyIHwgdW5kZWZpbmVkLFxuICByZWxlYXNlU3VjY2VlZGVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKG9yaWdpbmFsQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xuICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXhpc3RlZDtcbiAgfVxuICBpZiAocmVsZWFzZVN1Y2NlZWRlZCAmJiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ3BhY2thZ2UuanNvbicgJiYgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBvcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAoY3VycmVudENvbnRlbnQgIT09IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWxUZXh0KSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRDb250ZW50ID0gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudCwgb3JpZ2luYWxUZXh0KTtcbiAgICAgIGlmIChyZXN0b3JlZENvbnRlbnQgPT09IGN1cnJlbnRDb250ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCByZXN0b3JlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGN1cnJlbnRCdWZmZXI/LmVxdWFscyhvcmlnaW5hbENvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFdyaXRlIHRoZSBzbmFwc2hvdCBieXRlcyB2ZXJiYXRpbTogYnVuLmxvY2tiIGlzIGJpbmFyeSwgc28gYW55IHRleHQgZGVjb2RlL2VuY29kZSByb3VuZCB0cmlwXG4gIC8vIHdvdWxkIGNvcnJ1cHQgaXQuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1bmZpZ1xuICAgIC5yZXBsYWNlKC9eKFxccypsaW5rZXJcXHMqPVxccyopW1wiJ11pc29sYXRlZFtcIiddL211LCAnJDFcImhvaXN0ZWRcIicpXG4gICAgLnJlcGxhY2UoL15cXHMqZ2xvYmFsU3RvcmVcXHMqPVxccyp0cnVlW15cXG5dKlxcbj8vbXUsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMocGFja2FnZUpzb25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcGVyYXRlIG9ubHkgaW5zaWRlIHRoZSBkZXBlbmRlbmN5IHNlY3Rpb25zOiBhIGJsYW5rZXQgYFwid29ya3NwYWNlOi4uLlwiYCByZXBsYWNlbWVudCB3b3VsZFxuICAvLyBhbHNvIGNvcnJ1cHQgdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBkZXNjcmlwdGlvbiBzdGFydGluZyB3aXRoIGB3b3Jrc3BhY2U6YCksIGFuZCBhXG4gIC8vIG5hbWUta2V5ZWQgZ2xvYmFsIHJlcGxhY2VtZW50IHdvdWxkIHRvdWNoIHNhbWUtbmFtZWQga2V5cyBpbiBvdGhlciBzZWN0aW9ucyAoZS5nLiBvdmVycmlkZXMpLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKHBhY2thZ2VKc29uQ29udGVudCwgKHNlY3Rpb24pID0+XG4gICAgc2VjdGlvbi5yZXBsYWNlQWxsKC8oXCJbXlwiXFxuXStcIlxccyo6XFxzKilcIndvcmtzcGFjZTpbXlwiXSpcIi9ndSwgJyQxXCIqXCInKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWFwcGx5IHRoZSBvcmlnaW5hbCBgd29ya3NwYWNlOmAgc3BlY2lmaWVycyB0byB0aGUgQ1VSUkVOVCBtYW5pZmVzdCBjb250ZW50LiBNYXRjaGluZyBrZXlzXG4gKiBvZmYgdGhlIGRlcGVuZGVuY3kgTkFNRSAobm90IHRoZSBgXCIqXCJgIHBsYWNlaG9sZGVyKSBpcyBkZWxpYmVyYXRlOiBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ3NcbiAqIHByZXBhcmUgc3RlcCBvdmVyd3JpdGVzIGxvY2FsIGRlcGVuZGVuY3kgc3BlY2lmaWVycyB3aXRoIGNvbmNyZXRlIHJlbGVhc2VkIHZlcnNpb25zLCBhbmQgdGhlXG4gKiBjb21taXR0ZWQgbWFuaWZlc3QgbXVzdCBnZXQgaXRzIGB3b3Jrc3BhY2U6YCBwcm90b2NvbCBiYWNrIHJlZ2FyZGxlc3Mg4oCUIEJ1biByZXF1aXJlcyB0aGVcbiAqIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsIGxpbmtzIHRoZSB3b3Jrc3BhY2UgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSByZWdpc3RyeSBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudDogc3RyaW5nLCBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtzcGFjZURlcGVuZGVuY2llcyA9IGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMob3JpZ2luYWxDb250ZW50KTtcbiAgLy8gUmVzdG9yZSBwZXIgKHNlY3Rpb24sIG5hbWUpOiBhIHNhbWUtbmFtZWQgZGVwZW5kZW5jeSBpbiBhbm90aGVyIHNlY3Rpb24gbWF5IGxlZ2l0aW1hdGVseVxuICAvLyBob2xkIGEgbm9uLXdvcmtzcGFjZSByYW5nZSAoZS5nLiBhIHBlZXJEZXBlbmRlbmNpZXMgYD49MS4wLjBgIG5leHQgdG8gYSBkZXZEZXBlbmRlbmNpZXNcbiAgLy8gYHdvcmtzcGFjZToqYCkgb3IgYSBkaWZmZXJlbnQgd29ya3NwYWNlIHJhbmdlLCBhbmQgbXVzdCBrZWVwIGl0cyBvd24gdmFsdWUuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoY3VycmVudENvbnRlbnQsIChzZWN0aW9uLCBzZWN0aW9uS2V5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IHNlY3Rpb247XG4gICAgZm9yIChjb25zdCB7IHNlY3Rpb246IGRlcGVuZGVuY3lTZWN0aW9uLCBuYW1lLCBzcGVjaWZpZXIgfSBvZiB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5U2VjdGlvbiAhPT0gc2VjdGlvbktleSkgY29udGludWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChcbiAgICAgICAgbmV3IFJlZ0V4cChgKFwiJHtlc2NhcGVSZWdFeHAobmFtZSl9XCJcXFxccyo6XFxcXHMqKVwiW15cIl0qXCJgLCAnZ3UnKSxcbiAgICAgICAgLy8gQSByZXBsYWNlciBmdW5jdGlvbiwgbm90IGEgcmVwbGFjZW1lbnQgc3RyaW5nOiBzcGVjaWZpZXJzIGNvbnRhaW5pbmcgYCRgIG11c3QgYmVcbiAgICAgICAgLy8gaW5zZXJ0ZWQgbGl0ZXJhbGx5IGluc3RlYWQgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgc3Vic3RpdHV0aW9uIHBhdHRlcm5zLlxuICAgICAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuLyoqIERlcGVuZGVuY3kgc2VjdGlvbnMgY29udGFpbiBvbmx5IGBcIm5hbWVcIjogXCJzcGVjaWZpZXJcImAgc3RyaW5nIHBhaXJzLCBzbyBgW157fV0qYCBzcGFucyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHJlcGxhY2VTZWN0aW9uOiAoc2VjdGlvbjogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAvKFwiKGRlcGVuZGVuY2llc3xkZXZEZXBlbmRlbmNpZXN8b3B0aW9uYWxEZXBlbmRlbmNpZXN8cGVlckRlcGVuZGVuY2llcylcIlxccyo6XFxzKlxceykoW157fV0qKShcXH0pL2d1LFxuICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+XG4gICAgICBgJHtwcmVmaXh9JHtyZXBsYWNlU2VjdGlvbihib2R5LCBzZWN0aW9uS2V5KX0ke3N1ZmZpeH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nXG4pOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10ge1xuICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uO1xuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltrZXldID8/IHt9KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgc2VjdGlvbjoga2V5LCBuYW1lLCBzcGVjaWZpZXI6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdDogUHJvamVjdCwgYXJndjogUmVsZWFzZUFyZ3YsIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZvcndhcmRlZEFyZ3MgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV0ubWFwKFN0cmluZyk7XG4gIC8vIFRoZSBQQUNLQUdFIG5hbWUgKGZvciBgYnVueGAvYHlhcm4gZGx4YCwgd2hpY2ggZmV0Y2ggYSBwYWNrYWdlKSBhbmQgdGhlIEJJTiBuYW1lIChmb3IgdGhlXG4gIC8vIGxvY2FsIG5vZGVfbW9kdWxlcy8uYmluIGxvb2t1cCkgZGlmZmVyIGZvciB0aGUgc2NvcGVkIGZvcmtzOiBgYnVueCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlYFxuICAvLyB3b3VsZCBmZXRjaCB0aGUgdW5yZWxhdGVkIHVuc2NvcGVkIG5wbSBwYWNrYWdlIGluc3RlYWQgb2YgZS5nLiBAYW5vbGlsYWIncyBmb3JrLlxuICBjb25zdCByZWxlYXNlUGFja2FnZU5hbWUgPSAoXG4gICAgWydAYW5vbGlsYWIvbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXSBhcyBjb25zdFxuICApLmZpbmQoKHBhY2thZ2VOYW1lKSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSk7XG4gIGNvbnN0IHJlbGVhc2VCaW4gPSByZWxlYXNlUGFja2FnZU5hbWUgPyAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScgOiAnc2VtYW50aWMtcmVsZWFzZSc7XG5cbiAgLy8gVGhlIHByb2plY3QgaXMgbG9hZGVkIHdpdGggbG9hZEVudjogZmFsc2UgKHNlbWFudGljLXJlbGVhc2UgcnVucyB3aXRoIHRoZSBhbWJpZW50L0NJXG4gIC8vIGVudmlyb25tZW50IGJ5IGRlc2lnbiksIHNvIHByb2plY3QuZW52IGFsaWFzZXMgcHJvY2Vzcy5lbnYgaGVyZTsgdXNpbmcgaXQga2VlcHMgdGhlXG4gIC8vIHByb2plY3QuZW52IGNvbnZlbnRpb24gYW5kIHBpY2tzIHVwIGVudiBsb2FkaW5nIGlmIHRoYXQgZGVzaWduIGV2ZXIgY2hhbmdlcy5cbiAgY29uc3QgZW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgocHJvamVjdC5kaXJQYXRoLCBlbnYpO1xuICBjb25zdCBoYXNMb2NhbEJpbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJywgcmVsZWFzZUJpbikpO1xuICBjb25zdCBmYWxsYmFja1BhY2thZ2VOYW1lID0gcmVsZWFzZVBhY2thZ2VOYW1lID8/ICdzZW1hbnRpYy1yZWxlYXNlJztcbiAgY29uc3QgY29tbWFuZCA9IGhhc0xvY2FsQmluXG4gICAgPyBbcmVsZWFzZUJpbiwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICA6IHByb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kID09PSAnYnVuJ1xuICAgICAgPyBbJ2J1bngnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgICAgOiBbJ3lhcm4nLCAnZGx4JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc107XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiAke2NvbW1hbmQuam9pbignICcpfWApKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSByZXR1cm4gMDtcblxuICByZXR1cm4gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCBjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZXNvbHZlRmFsbGJhY2tXYkVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBnZXRSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcywgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB1c2VzQnVuUnVudGltZSB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCB9IGZyb20gJy4vZG90ZW52LmpzJztcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdydW4gW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBydW4gYSBzY3JpcHQgd2l0aCB0aGUgcHJvamVjdCBydW50aW1lLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHtcbiAgICAgICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSxcbiAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IHRydWUsXG4gICAgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFyZ3MgPSBnZXRSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgcnVuIDxzY3JpcHQ+IFthcmdzLi4uXScpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgY3dkKTtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0Py5lbnYgPz8gcmVhZFN0YW5kYWxvbmVFbnZpcm9ubWVudChhcmd2LCBjd2QpO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZFJ1bkNvbW1hbmQoY3dkLCBhcmdzLCBlbnYsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGBXb3VsZCBydW46ICR7Y29tbWFuZC5qb2luKCcgJyl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoY29tbWFuZCwgJ3diIHJ1biA8c2NyaXB0PiBbYXJncy4uLl0nLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZFJ1bkNvbW1hbmQoY3dkOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBwcm9qZWN0PzogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCF1c2VzQnVuUnVudGltZShjd2QpKSByZXR1cm4gWydub2RlJywgLi4uYXJnc107XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBwYWNrYWdlLmpzb24gc2NyaXB0cyBiZWZvcmUgbG9jYWwgYmluYXJpZXMsIHNvIGEgc2NyaXB0IHRoYXQgaW52b2tlc1xuICAvLyBgd2IgcnVuIDxpdHMgb3duIG5hbWU+YCAoZS5nLiBcInZpdGVzdFwiOiBcIndiIHJ1biB2aXRlc3QgcnVuXCIpIHdvdWxkIHJlc3Bhd24gaXRzZWxmIGZvcmV2ZXIuXG4gIC8vIEJ5cGFzcyBzY3JpcHQgcmVzb2x1dGlvbiBvbmx5IGZvciBnZW51aW5lIHNlbGYtcmVjdXJzaW9uOiB0aGUgdGFyZ2V0IG5hbWVzIHRoZSBsaWZlY3ljbGVcbiAgLy8gc2NyaXB0IHRoYXQgc3Bhd25lZCB0aGlzIHByb2Nlc3MgQU5EIHRoZSBjdXJyZW50IHBhY2thZ2UgZGVjbGFyZXMgdGhhdCB2ZXJ5IHNjcmlwdCB0ZXh0IOKAlFxuICAvLyBhIGNyb3NzLXBhY2thZ2UgZGVsZWdhdGlvbiB2aWEgLS13b3JraW5nLWRpciByZWFjaGVzIGEgZGlmZmVyZW50IHNjcmlwdCB0ZXh0LCBzbyBpdCBzdGlsbFxuICAvLyBydW5zIHRoZSBkZXN0aW5hdGlvbidzIHNjcmlwdC4gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiB0b1xuICAvLyBQQVRILCByZXNvbHZpbmcgdGhlIGRpcmVjdCBleGVjdXRpb24gdG8gdGhlIGxvY2FsIGJpbmFyeS5cbiAgY29uc3QgdGFyZ2V0ID0gYXJnc1swXTtcbiAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT09IGVudi5ucG1fbGlmZWN5Y2xlX2V2ZW50KSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdCA/IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uW3RhcmdldF0gOiByZWFkUGFja2FnZVNjcmlwdChjd2QsIHRhcmdldCk7XG4gICAgaWYgKHNjcmlwdCAhPT0gdW5kZWZpbmVkICYmIHNjcmlwdCA9PT0gZW52Lm5wbV9saWZlY3ljbGVfc2NyaXB0KSByZXR1cm4gWy4uLmFyZ3NdO1xuICB9XG4gIHJldHVybiBbJ2J1bicsICdydW4nLCAuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VTY3JpcHQoY3dkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBzY3JpcHRzIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgcGFja2FnZS5qc29uLCBzbyBtYXRjaCB0aGF0IHNjb3BlXG4gIC8vIChlLmcuIC0td29ya2luZy1kaXIgbWF5IHBvaW50IHRvIGEgbWFuaWZlc3QtbGVzcyBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlY3Vyc2luZyBwYWNrYWdlKS5cbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGFja2FnZUpzb24uc2NyaXB0cz8uW25hbWVdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhbmRhbG9uZUVudmlyb25tZW50KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgY3dkOiBzdHJpbmcpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IFtlbnZdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZW52LldCX0VOViB8fD0gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndik7XG4gIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3YsIGVudik7XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudik6IHZvaWQge1xuICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcbiAgY29uc3Qgc3RhbmRhcmRNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcbiAgaWYgKGVudi5XQl9FTlYgJiYgIXN0YW5kYXJkTW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7ZW52LldCX0VOVn1cIi4gYCArXG4gICAgICAgICdGaXggdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBzZWxlY3RlZENhc2NhZGUgPVxuICAgIHR5cGVvZiBhcmd2LmNhc2NhZGVFbnYgPT09ICdzdHJpbmcnXG4gICAgICA/IGFyZ3YuY2FzY2FkZUVudlxuICAgICAgOiBhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2VcbiAgICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoZW52LldCX0VOViAmJiBzZWxlY3RlZENhc2NhZGUgJiYgc3RhbmRhcmRNb2Rlcy5oYXMoc2VsZWN0ZWRDYXNjYWRlKSAmJiBlbnYuV0JfRU5WICE9PSBzZWxlY3RlZENhc2NhZGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke3NlbGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAnRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIChkLm5hbWUgPT09ICdtaXNlLnRvbWwnIHx8IGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignbWlzZSBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgcmVzb2x2ZXMgdGhlIHByb2plY3QncyBBQ1RJVkUgaW50ZXJwcmV0ZXIgdG8gYSBzaW5nbGUgYWJzb2x1dGUgcGF0aCxcbiAgICAgIC8vIHVubGlrZSBgbWlzZSBjdXJyZW50IHB5dGhvbmAsIHdoaWNoIHByaW50cyBldmVyeSBjb25maWd1cmVkIHZlcnNpb24gKG1pc2Ugc3VwcG9ydHNcbiAgICAgIC8vIG11bHRpLXZlcnNpb24gcGlucykgYW5kIHdvdWxkIHBhc3MgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC5cbiAgICAgIGxldCBweXRob25QYXRoID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBweXRob25QYXRoID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgICAgIC5leGVjU3luYygnbWlzZSB3aGljaCBweXRob24nLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSB9KVxuICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtaXNlIG1pc3Npbmcgb3IgcHl0aG9uIHVuY29uZmlndXJlZDsgbGV0IHBvZXRyeSBwaWNrIGl0cyBkZWZhdWx0IGludGVycHJldGVyLlxuICAgICAgfVxuICAgICAgaWYgKHB5dGhvblBhdGgpIHtcbiAgICAgICAgLy8gVGhlIGNvbW1hbmQgcnVucyB0aHJvdWdoIGEgc2hlbGw7IFBPU0lYIHNpbmdsZSBxdW90ZXMga2VlcCB0aGUgcGF0aCBvbmUgbGl0ZXJhbCBhcmd1bWVudFxuICAgICAgICAvLyBldmVuIHdoZW4gYSByZWxvY2F0ZWQgbWlzZSBkYXRhIGRpciBwdXRzIG1ldGFjaGFyYWN0ZXJzIGludG8gaXQuXG4gICAgICAgIGNvbnN0IHF1b3RlZFB5dGhvblBhdGggPSBgJyR7cHl0aG9uUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7cXVvdGVkUHl0aG9uUGF0aH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgZm5veEFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52LkZOT1hfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1mbm94X2FnZV9rZXksZW52PUZOT1hfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7Zm5veEFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIC8vIE5vIGFnZS1rZXkgZm9yd2FyZGluZzogYSBydW5uaW5nIGNvbnRhaW5lciBnZXRzIGl0cyBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRlY2xhcmVkXG4gICAgLy8gdmFyaWFibGVzIGZvcndhcmRlZCBiZWxvdyAob3IgdGhlIHBsYXRmb3JtJ3Mgc3RvcmUgaW4gcHJvZHVjdGlvbiksIGFuZCBoYW5kaW5nIHRoZVxuICAgIC8vIG9yZ2FuaXphdGlvbi13aWRlIGlkZW50aXR5IHRvIGV2ZXJ5IHRlc3RlZCBjb250YWluZXIgd291bGQgbGV0IGFueSBhcHBsaWNhdGlvbiBvclxuICAgIC8vIGRlcGVuZGVuY3kgY29kZSByZWFkIGl0LlxuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke3NlbGVjdENvbnRhaW5lckVudk9wdGlvbnMocHJvamVjdCl9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGRvY2tlciBybSAtZiAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSA+IC9kZXYvbnVsbCAyPiYxIHx8IHRydWVgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuXG4vLyBWYXJpYWJsZXMgdGhlIElNQUdFIGl0c2VsZiBvd25zOiBhIERvY2tlcmZpbGUgcGlucyB0aGUgY29udGFpbmVyIHBvcnQgKHRoZSBwdWJsaXNoZWQgbWFwcGluZ1xuLy8gdGFyZ2V0cyA4MDgwLCBub3QgdGhlIGhvc3Qtc2lkZSBQT1JUKSBhbmQgdGhlIHJ1bnRpbWUgbW9kZSBpdCB3YXMgYnVpbHQgZm9yLCBhbmQgYmVmb3JlIGZub3ggdGhlXG4vLyBiYWtlZCAuZW52IGZpbGVzIGxvc3QgdG8gdGhvc2UgYEVOVmAgdmFsdWVzIHRvbyBiZWNhdXNlIHByb2Nlc3MuZW52IHdpbnMgb3ZlciBlbnYgc291cmNlcy5cbmNvbnN0IElNQUdFX09XTkVEX0tFWVMgPSBuZXcgU2V0KFsnTk9ERV9FTlYnLCAnUE9SVCddKTtcblxuLyoqXG4gKiBgZG9ja2VyIHJ1biAtLWVudiBLRVlgIG9wdGlvbnMgZm9yIGV2ZXJ5IHZhcmlhYmxlIHRoZSBwcm9qZWN0IGRlY2xhcmVzLCBzbyBhIGNvbnRhaW5lciBnZXRzIHRoZVxuICogYXBwJ3MgZW52aXJvbm1lbnQuIFNpbmNlIGZub3ggcmVwbGFjZWQgdGhlIC5lbnYgZmlsZXMgdGhhdCBpbWFnZXMgdXNlZCB0byBiYWtlIGluIOKAlCB0aGUgYWdlIGtleVxuICogdGhhdCBkZWNyeXB0cyB0aGVtIG11c3QgbmV2ZXIgZW50ZXIgYSBjb250YWluZXIg4oCUIGEgY29udGFpbmVyIHdvdWxkIG90aGVyd2lzZSBzdGFydCB3aXRoIG5vXG4gKiBjb25maWd1cmF0aW9uIGF0IGFsbC4gT25seSBOQU1FUyBhcmUgcGFzc2VkOiBkb2NrZXIgdGhlbiBmb3J3YXJkcyBlYWNoIHZhbHVlIGZyb20gd2IncyBvd25cbiAqIGVudmlyb25tZW50LCBrZWVwaW5nIHNlY3JldHMgb3V0IG9mIHRoZSBjb21tYW5kIGxpbmUgKHZpc2libGUgaW4gYHBzYCBvdXRwdXQgYW5kIENJIGxvZ3MpLlxuICovXG5mdW5jdGlvbiBzZWxlY3RDb250YWluZXJFbnZPcHRpb25zKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICBjb25zdCBvcHRpb25zID0gc2VsZWN0Q29udGFpbmVyRW52S2V5cyhwcm9qZWN0LmRlY2xhcmVkRW52S2V5cywgcHJvamVjdC5lbnYpLm1hcCgoa2V5KSA9PiBgLS1lbnYgJHtrZXl9YCk7XG4gIHJldHVybiBvcHRpb25zLmxlbmd0aCA+IDAgPyBgJHtvcHRpb25zLmpvaW4oJyAnKX0gYCA6ICcnO1xufVxuXG4vKiogVGhlIGRlY2xhcmVkIHZhcmlhYmxlcyB0byBmb3J3YXJkIGludG8gYSBjb250YWluZXIsIHNvcnRlZCBmb3IgYSBzdGFibGUgY29tbWFuZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RDb250YWluZXJFbnZLZXlzKFxuICBkZWNsYXJlZEVudktleXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmRlY2xhcmVkRW52S2V5c11cbiAgICAuZmlsdGVyKChrZXkpID0+ICFJTUFHRV9PV05FRF9LRVlTLmhhcyhrZXkpICYmIGVudltrZXldICE9PSB1bmRlZmluZWQpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kLCBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHtcbiAgZmluZEQxTWlncmF0aW9uc0RpclBhdGgsXG4gIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbiAgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqIFJhdyBQbGF5d3JpZ2h0IGFyZ3MgZm9yd2FyZGVkIGFmdGVyIGB3YiB0ZXN0IC0tIC4uLmAgKi9cbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwID0gc2hvdWxkV2FpdEFuZE9wZW5BcHA7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkSW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICBhc3luYyBzdGFydERldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXN5bmMgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3diJyxcbiAgICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICAgIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyksXG4gICAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgICBdKX1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tU3RhcnRTY3JpcHRQYXRoID0gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdCk7XG4gICAgaWYgKGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCkge1xuICAgICAgY29uc3Qgc3RhcnRDb21tYW5kID1cbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gICAgICAvLyBBIHN0YXJ0IHNjcmlwdCBmb3VuZCBhdCB0aGUgbW9ub3JlcG8gcm9vdCAoY2YuIFByb2plY3QuZmluZEZpbGUpIGlzIHdyaXR0ZW4gdG8gcnVuIGZyb21cbiAgICAgIC8vIHRoZSByb290LCBsaWtlIERvY2tlcidzIFdPUktESVIsIHNvIGl0cyBjd2QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc2NyaXB0cy8uXG4gICAgICBjb25zdCBzY3JpcHRSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSk7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIFtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIHNjcmlwdFJvb3REaXJQYXRoID09PSBwcm9qZWN0LmRpclBhdGhcbiAgICAgICAgICA/IHN0YXJ0Q29tbWFuZFxuICAgICAgICAgIDogYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBzY3JpcHRSb290RGlyUGF0aF0pfSAmJiAke3N0YXJ0Q29tbWFuZH0pYCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9IGVjb3N5c3RlbUNvbmZpZ1BhdGhcbiAgICAgID8gW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgcG0yLXJ1bnRpbWUgc3RhcnQgLS1uby1hdXRvcmVzdGFydCAke2Vjb3N5c3RlbUNvbmZpZ1BhdGh9YF1cbiAgICAgIDogdGhpcy5idWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgY29tbWFuZHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYCR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIGNvbW1hbmRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSB0aGlzLmJ1aWxkTWlncmF0aW9uQ29tbWFuZHMocHJvamVjdCk7XG4gICAgLy8gU3BsaXR0aW5nIG1heSBjdXQgdGhyb3VnaCBhIGAoY2Qg4oCmICYmIOKApilgIHN1YnNoZWxsLCBidXQgcmVqb2luaW5nIHdpdGggJyAmJiAnIGFuZCBwZXItcGllY2VcbiAgICAvLyByZWRpcmVjdHMga2VlcHMgdGhlIHNjcmlwdCB2YWxpZCwgYW5kIHdiLWdlbmVyYXRlZCBwYXRocyBuZXZlciBjb250YWluICcmJicuXG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZE1pZ3JhdGlvbkNvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gICAgLy8gVGVzdC1lbnZpcm9ubWVudCB3cmFuZ2xlciBzdGF0ZSBpcyBkaXNwb3NhYmxlOyB3aXBlIGl0IGVudGlyZWx5IChub3QganVzdCBEMSkgYmVmb3JlXG4gICAgLy8gbWlncmF0aW5nLCBzaW5jZSBzdGFsZSBLViBjYWNoZSBlbnRyaWVzIG9yIER1cmFibGUgT2JqZWN0IHN0b3JhZ2UgY2FuIGJyZWFrIGUyZSB0ZXN0cy5cbiAgICBjb25zdCB3cmFuZ2xlclN0YXRlV2lwZUNvbW1hbmRzID1cbiAgICAgIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KVxuICAgICAgICA/IFtgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgXVxuICAgICAgICA6IFtdO1xuICAgIC8vIEEgcHJvamVjdCB3aG9zZSBEMSBiaW5kaW5ncyBjYXJyeSB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyBhcHBsaWVzIHRoZW0gd2l0aCB3cmFuZ2xlclxuICAgIC8vIChzZWUgV29ya2Vyc1NjcmlwdHMgLyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCkuIFJ1bm5pbmcgZHJpenpsZS1raXQgbWlncmF0ZSBhZ2FpbnN0XG4gICAgLy8gdGhlIHNhbWUgbG9jYWwgRDEgd291bGQgYXBwbHkgdGhlIHNhbWUgU1FMIHR3aWNlIOKAlCBkcml6emxlJ3MgZ2VuZXJhdGVkIHN0YXRlbWVudHMgYXJlIG5vdFxuICAgIC8vIGlkZW1wb3RlbnQgKGBDUkVBVEUgSU5ERVhgIHdpdGhvdXQgSUYgTk9UIEVYSVNUUykg4oCUIHNvIGRyaXp6bGUgc3RheXMgT1JNLW9ubHkgdGhlcmUuXG4gICAgY29uc3QgbWlncmF0ZXNEMVdpdGhXcmFuZ2xlciA9ICEhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLndyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMsXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc0RyaXp6bGUgJiYgIW1pZ3JhdGVzRDFXaXRoV3JhbmdsZXJcbiAgICAgICAgPyBbd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgZHJpenpsZVNjcmlwdHMubWlncmF0ZUZvclN0YXJ0KHByb2plY3QpKV1cbiAgICAgICAgOiBbXSksXG4gICAgXTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgLy8gSW4gdGhlIHRlc3QgZW52aXJvbm1lbnQgdGhlIGRldiBzZXJ2ZXIgcnVucyBhZ2FpbnN0IGZyZXNoLCBkaXNwb3NhYmxlIHN0YXRlIChlLmcuIGFuIGVtcHR5XG4gICAgLy8gbG9jYWwgRDEpLCBzbyB0aGUgc2NoZW1hIG11c3QgYmUgbWlncmF0ZWQgZmlyc3Qg4oCUIGFuIGFwcCB3aG9zZSBwYWdlcyBxdWVyeSB0aGUgZGF0YWJhc2VcbiAgICAvLyB3b3VsZCBvdGhlcndpc2UgYW5zd2VyIDUwMCBhbmQgdGhlIHN0YXJ0dXAgY2hlY2sgd291bGQgbmV2ZXIgc2VlIGEgMnh4LlxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSA/IHRoaXMuYnVpbGRNaWdyYXRpb25Db21tYW5kcyhwcm9qZWN0KSA6IFtdO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3Jrcy5cbiAgICBjb25zdCBzdGFydHVwQ2hlY2tDb21tYW5kID0gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICAgIHJldHVybiBbLi4ubWlncmF0aW9uQ29tbWFuZHMsIHN0YXJ0dXBDaGVja0NvbW1hbmRdLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSB0aGlzLmJ1aWxkUGxheXdyaWdodE9ubHlDb21tYW5kKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gcGxheXdyaWdodENvbW1hbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMDAgLWkgMjAwMCcpfVxuICAgICAgICAmJiAke2J1aWxkSHR0cFJlYWRpbmVzc0NvbW1hbmQocG9ydCl9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9YCxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKdXN0IHJ1bnMgUGxheXdyaWdodCAocGx1cyB0aGUgb3B0aW9uYWwgYHRlc3QvZTJlLWFkZGl0aW9uYWxgIHNjcmlwdCksIHdpdGhvdXQgbGF1bmNoaW5nIHRoZSBhcHAuXG4gICAqIFVzZSB3aGVuIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC5cbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGAke2J1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyl9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGB3YiB0ZXN0YCBzaG91bGQgYXBwbHkgdGhlIHVuaXQgcnVubmVyJ3Mgb3V0cHV0IGhhbmRsaW5nIHRvIHRoZSBlMmUgcGhhc2UgKHRoZSBkZWZhdWx0XG4gICAqIHBhdGgncyBsb2cgZGVkdXBlIHdvdWxkIGRyb3AgcmVwZWF0ZWQgZmFpbHVyZSBkZXRhaWxzKS4gVHJ1ZSBvbmx5IHdoZW4gdGhlIGUyZSBjb21tYW5kIGlzIHRoZVxuICAgKiBiYXJlIHVuaXQgcnVubmVyOiBodHRwLXNlcnZlciBhbmQgV29ya2VycyBwcm9qZWN0cyBtYXkgYWxzbyBlbWl0IGl0LCBidXQgd3JhcHBlZCBpblxuICAgKiBgd2IgY29uY3VycmVudGx5YCB3aXRoIGEgbGl2ZSBzZXJ2ZXIgd2hvc2UgcmVwZXRpdGl2ZSBsb2dzIGFyZSB3aGF0IHRoZSBkZWR1cGUgZXhpc3RzIGZvci5cbiAgICovXG4gIHVzZXNVbml0UnVubmVyRm9yRTJlKF86IFByb2plY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDUwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDEwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSAyMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMjAwMDAgLWkgNDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwIC1pIDUwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA5MDAwMCAtaSAxMDAwMCcpfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQpfSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB3YWl0LW9uIGJvb3QgY2hlY2sgZm9yIGEgbGlzdGVuaW5nIGxvb3BiYWNrIHBvcnQuIEEgVENQIGNoZWNrIHRyZWF0cyByZWRpcmVjdHMgYW5kXG4gKiBhdXRoZW50aWNhdGlvbiByZXNwb25zZXMgYXMgYSBzdWNjZXNzZnVsbHkgc3RhcnRlZCBzZXJ2ZXI7IGFuIEhUVFAgc3RhdHVzIGNoZWNrIHdvdWxkIGtlZXBcbiAqIHdhaXRpbmcgZXZlbiB0aG91Z2ggUGxheXdyaWdodCBjYW4gYWxyZWFkeSB1c2UgdGhlIGFwcC4gYGxvY2FsaG9zdGAgbGV0cyBOb2RlIHRyeSBib3RoIGFkZHJlc3NcbiAqIGZhbWlsaWVzIHdoZW4gYSBkZXYgc2VydmVyIGJpbmRzIG9ubHkgSVB2NCBvciBJUHY2LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCB3YWl0T25BcmdzPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCBwb3J0ID09PSAnJykgdGhyb3cgbmV3IEVycm9yKCdQb3J0IGlzIHJlcXVpcmVkIGZvciB0aGUgbG9vcGJhY2sgcmVhZGluZXNzIGNoZWNrLicpO1xuICByZXR1cm4gYHdhaXQtb24gJHt3YWl0T25BcmdzID8gYCR7d2FpdE9uQXJnc30gYCA6ICcnfXRjcDpsb2NhbGhvc3Q6JHtwb3J0fWA7XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIEhUVFAgcmVhZGluZXNzIGNoZWNrIHRoYXQgcmVxdWlyZXMgYW4gYWN0dWFsIHJlc3BvbnNlIGZyb20gdGhlIGFwcC4gQSBUQ1AgY2hlY2sgYWxvbmVcbiAqIGlzIG5vdCBlbm91Z2ggZm9yIERvY2tlcml6ZWQgc2VydmVyczogZG9ja2VyLXByb3h5IGFjY2VwdHMgY29ubmVjdGlvbnMgYXMgc29vbiBhcyB0aGUgcG9ydCBpc1xuICogcHVibGlzaGVkLCBsb25nIGJlZm9yZSB0aGUgYXBwIGluc2lkZSB0aGUgY29udGFpbmVyIGxpc3RlbnMsIHNvIHRlc3RzIHdvdWxkIHN0YXJ0IGFnYWluc3QgYSBkZWFkXG4gKiBiYWNrZW5kIGFuZCB0aGUgcnVuIGRpZXMgaW4gYSBraWxsLW90aGVycyBjYXNjYWRlLiBBbnkgSFRUUCBzdGF0dXMgY291bnRzIGFzIHJlYWR5IChjdXJsIHdpdGhvdXRcbiAqIC1mKSwgc28gcmVkaXJlY3Rpbmcgb3IgYXV0aC1ndWFyZGVkIHNlcnZlcnMgc3RpbGwgcGFzcyDigJQgdGhlIHJlYXNvbiB0aGUgYm9vdCBjaGVjayBtb3ZlZCBmcm9tXG4gKiBodHRwLWdldCB0byB0Y3AgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIdHRwUmVhZGluZXNzQ29tbWFuZChwb3J0OiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYGN1cmwgLXMgLW8gL2Rldi9udWxsIC1tIDUgLS1yZXRyeSAxNTAgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktYWxsLWVycm9ycyBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnc2NyaXB0cy9zdGFydC1wcm9kdWN0aW9uLnNoJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQge1xuICBCYXNlU2NyaXB0cyxcbiAgYnVpbGRIdHRwUmVhZGluZXNzQ29tbWFuZCxcbiAgYnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQsXG4gIHR5cGUgVGVzdEUyRU9wdGlvbnMsXG59IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC9lMmUvJ107XG4gICAgY29uc3QgdGVzdENvbW1hbmQgPSB0aGlzLnRlc3RVbml0KHByb2plY3QsIHsgLi4uYXJndiwgdGFyZ2V0czogbm9ybWFsaXplZFRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMDAgLWkgMjAwMCcpfSAmJiAke2J1aWxkSHR0cFJlYWRpbmVzc0NvbW1hbmQocG9ydCl9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBTRVJWRVJfTE9HX0ZJTEUgPSAnc2VydmVyLmxvZyc7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIHJ1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ30gfCB0ZWUgJHtTRVJWRVJfTE9HX0ZJTEV9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFV2l0aG91dFNlcnZlcihwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVXaXRob3V0U2VydmVyKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICB9XG4gIC8vIEEgcGxhaW4gcHJvamVjdCBoYXMgbm8gc2VydmVyIHRvIGNvbnRhaW5lcml6ZTsgYHdiIHRlc3Qtb24tY2lgIG11c3Qgc3RpbGwgcnVuIGV2ZXJ5IG5vbi1kZWJ1Z1xuICAvLyB0ZXN0LCBzbyB0aGUgRG9ja2VyIHBhdGggcnVucyB0aGUgc2FtZSBzdWl0ZSBvbiB0aGUgaG9zdCBhcyB0aGUgbm9uLURvY2tlciBwYXRoLlxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVdpdGhvdXRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdXNlc1VuaXRSdW5uZXJGb3JFMmUocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhcHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnO1xuICB9XG5cbiAgLy8gQSBsaWJyYXJ5IGhhcyBubyBzZXJ2ZXIgb2YgaXRzIG93biwgYnV0IGl0IG1heSBzaGlwIGEgc2VsZi1jb250YWluZWQgUGxheXdyaWdodCBmaXh0dXJlIHdob3NlXG4gIC8vIGNvbmZpZyBidWlsZHMgYW5kIHN0YXJ0cyB0aGUgYXBwIHVuZGVyIHRlc3QgdmlhIGEgYHdlYlNlcnZlcmAgYmxvY2sgKGUuZy4gYSBOZXh0LmpzIGZpeHR1cmUgdGhhdFxuICAvLyB2ZXJpZmllcyB0aGUgcHVibGlzaGVkIHBhY2thZ2UgaW1wb3J0cyBjbGVhbmx5KS4gUnVuIFBsYXl3cmlnaHQgZGlyZWN0bHkgaW4gdGhhdCBjYXNlIOKAlCBpbmNsdWRpbmdcbiAgLy8gb24gQ0ksIHdoZXJlIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgc3RhcnRzIHRoZSBmaXh0dXJlLiBPdGhlcndpc2UgcnVuIGB0ZXN0L2UyZS9gIHdpdGggdGhlXG4gIC8vIHVuaXQtdGVzdCBydW5uZXI6IENMSSBhbmQgbGlicmFyeSBwcm9qZWN0cyBrZWVwIHNsb3cgdGVzdHMgaGl0dGluZyByZWFsIGV4dGVybmFsIGRlcGVuZGVuY2llc1xuICAvLyB0aGVyZSwgYW5kIHdpdGhvdXQgdGhpcyBwYXRoIHRoZXkgd291bGQgbmV2ZXIgcnVuLlxuICBwcml2YXRlIGFzeW5jIHRlc3RFMkVXaXRob3V0U2VydmVyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodFdlYlNlcnZlckNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIEEgUGxheXdyaWdodCBjb25maWcgd2l0aG91dCBgd2ViU2VydmVyYCBleHBlY3RzIGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgKHRoZSBzaGFwZSB3YmZ5J3NcbiAgICAvLyBwbGF5d3JpZ2h0Q29uZmlnIGZpeGVyIGRvY3VtZW50cyk7IGl0cyBzcGVjcyBjYW5ub3QgcnVuIHVuZGVyIHRoZSB1bml0IHJ1bm5lci5cbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gICAgfVxuICAgIC8vIGB3YiB0ZXN0IC0tIDxhcmdzPmAgZW5hYmxlcyB0aGUgZTJlIHBoYXNlLCBzbyBkcm9wcGluZyB0aGUgZm9yd2FyZGVkIGFyZ3MgaGVyZSB3b3VsZCBydW4gdGhlXG4gICAgLy8gd2hvbGUgKHBvdGVudGlhbGx5IHBhaWQpIHN1aXRlIHVuZmlsdGVyZWQ7IHRyYW5zbGF0ZSB3aGF0IHRoZSB1bml0IHJ1bm5lcnMgdW5kZXJzdGFuZC5cbiAgICBjb25zdCBmb3J3YXJkZWQgPSBhZGFwdEZvcndhcmRlZEFyZ3NGb3JVbml0UnVubmVyKG9wdGlvbnMuZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPz8gW10pO1xuICAgIGlmIChmb3J3YXJkZWQudW5zdXBwb3J0ZWRPcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2VjaG8nLFxuICAgICAgICBgU2tpcHBpbmcgdGVzdC9lMmUvIChjYW5ub3QgZm9yd2FyZCB0aGUgUGxheXdyaWdodCBhcmcgdG8gdGhlIHVuaXQtdGVzdCBydW5uZXI6ICR7Zm9yd2FyZGVkLnVuc3VwcG9ydGVkT3B0aW9ufSkuYCxcbiAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCBleHBsaWNpdFRhcmdldHMgPSBbLi4uKGFyZ3YudGFyZ2V0cyA/PyBbXSksIC4uLmZvcndhcmRlZC50YXJnZXRzXTtcbiAgICBjb25zdCB0YXJnZXRzID0gZXhwbGljaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHVuaXRSdW5uZXJDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5mbGFncy5sZW5ndGggPiAwXG4gICAgICA/IGAke3VuaXRSdW5uZXJDb21tYW5kfSAke2J1aWxkU2hlbGxDb21tYW5kKGZvcndhcmRlZC5mbGFncyl9YFxuICAgICAgOiB1bml0UnVubmVyQ29tbWFuZDtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuXG5jb25zdCBOQU1FX0ZJTFRFUl9PUFRJT05fUkVHRVhQID0gL14oPzotdHwtZ3wtLWdyZXB8LS10ZXN0LW5hbWUtcGF0dGVybikoPzo9KD88dmFsdWU+LiopKT8kLztcblxuLyoqXG4gKiBTcGxpdHMgYHdiIHRlc3QgLS0gPGFyZ3M+YCAoZG9jdW1lbnRlZCBhcyBQbGF5d3JpZ2h0IGZsYWdzKSBpbnRvIHdoYXQgYGJ1biB0ZXN0YC92aXRlc3QgYWNjZXB0OlxuICogYmFyZSBwYXRocyBiZWNvbWUgcG9zaXRpb25hbCB0YXJnZXRzLCBhbmQgdGhlIG5hbWUtZmlsdGVyIGZsYWdzIGJvdGggcnVubmVycyBzaGFyZSBhcmUgdHJhbnNsYXRlZFxuICogdG8gYSBzaW5nbGUgYC10PTxwYXR0ZXJuPmAgdG9rZW4gKGA9YC1qb2luZWQgc28gYSBwYXR0ZXJuIHN0YXJ0aW5nIHdpdGggYC1gIGlzIG5vdCBwYXJzZWQgYXMgYW5cbiAqIG9wdGlvbjsgbGFzdCBmaWx0ZXIgd2lucywgbWF0Y2hpbmcgUGxheXdyaWdodCdzIENMSSkuIEFueSBvdGhlciBvcHRpb24gaXMgcmVwb3J0ZWQgaW5zdGVhZCBvZlxuICogYmVpbmcgc3BsaWNlZCBpbnRvIHRoZSBydW5uZXIgY29tbWFuZCDigJQgdml0ZXN0IGFib3J0cyBvbiB1bmtub3duIG9yIGR1cGxpY2F0ZWQgb3B0aW9ucywgd2hpY2hcbiAqIHdvdWxkIGtpbGwgdGhlIHdob2xlIG1vbm9yZXBvIHRlc3QgcnVuLlxuICovXG5mdW5jdGlvbiBhZGFwdEZvcndhcmRlZEFyZ3NGb3JVbml0UnVubmVyKGFyZ3M6IHN0cmluZ1tdKToge1xuICB0YXJnZXRzOiBzdHJpbmdbXTtcbiAgZmxhZ3M6IHN0cmluZ1tdO1xuICB1bnN1cHBvcnRlZE9wdGlvbj86IHN0cmluZztcbn0ge1xuICBjb25zdCB0YXJnZXRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbmFtZUZpbHRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmdzW2luZGV4XSBhcyBzdHJpbmc7XG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgdGFyZ2V0cy5wdXNoKC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyTWF0Y2ggPSBOQU1FX0ZJTFRFUl9PUFRJT05fUkVHRVhQLmV4ZWMoYXJnKTtcbiAgICBpZiAoZmlsdGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyTWF0Y2guZ3JvdXBzPy52YWx1ZSA/PyBhcmdzWysraW5kZXhdO1xuICAgICAgLy8gQSBtaXNzaW5nIG9yIGVtcHR5IGZpbHRlciB2YWx1ZSAoZS5nLiBgLS1ncmVwIFwiJFVOU0VUX1ZBUlwiYCkgbXVzdCBub3QgZmFsbCB0aHJvdWdoIHRvIGFuXG4gICAgICAvLyB1bmZpbHRlcmVkIHJ1biBvZiB0aGUgd2hvbGUgKHBvdGVudGlhbGx5IHBhaWQpIHN1aXRlIOKAlCBgLXQgJydgIG1hdGNoZXMgZXZlcnkgdGVzdC5cbiAgICAgIGlmICghdmFsdWUpIHJldHVybiB7IHRhcmdldHMsIGZsYWdzOiBbXSwgdW5zdXBwb3J0ZWRPcHRpb246IGFyZyB9O1xuICAgICAgbmFtZUZpbHRlciA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4geyB0YXJnZXRzLCBmbGFnczogW10sIHVuc3VwcG9ydGVkT3B0aW9uOiBhcmcgfTtcbiAgICB9XG4gICAgdGFyZ2V0cy5wdXNoKGFyZyk7XG4gIH1cbiAgcmV0dXJuIHsgdGFyZ2V0cywgZmxhZ3M6IG5hbWVGaWx0ZXIgPT09IHVuZGVmaW5lZCA/IFtdIDogW2AtdD0ke25hbWVGaWx0ZXJ9YF0gfTtcbn1cbiIsIi8vIEBvcnBjL3NlcnZlciBjb3VudHM6IGFuIG9SUEMgYXBwIHNlcnZlcyBSUEMgb3ZlciBIVFRQLCBzbyBpdHMgZTJlIHRlc3RzIG5lZWQgdGhlIHJ1bm5pbmdcbi8vIHNlcnZlciAoZS5nLiB0aGUgRG9ja2VyIGNvbnRhaW5lciBvbiBDSSkganVzdCBsaWtlIHRoZSBjbGFzc2ljIEhUVFAgZnJhbWV3b3Jrcy5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ0BvcnBjL3NlcnZlcicsICdleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICAvLyBCbGl0eidzIHdpdGhCbGl0eiB3aXJlcyBpdHMgUlBDIGxheWVyIHRocm91Z2ggYSB3ZWJwYWNrIGxvYWRlciwgd2hpY2ggVHVyYm9wYWNrIGlnbm9yZXMsXG4gICAgLy8gc28gQmxpdHogYXBwcyBtdXN0IHJ1biB0aGUgd2VicGFjayBkZXYgc2VydmVyIChUdXJib3BhY2sgZGllcyB3aXRoIHJlc29sdmUgZXJyb3JzKS5cbiAgICAvLyBQYXNzaW5nIG5vIGJ1bmRsZXIgZmxhZyBzZWxlY3RzIHdlYnBhY2sgb25seSBvbiBOZXh0LmpzIDE1OyBOZXh0LmpzIDE2IGRlZmF1bHRzIHRvXG4gICAgLy8gVHVyYm9wYWNrIGFuZCBuZWVkcyBhbiBleHBsaWNpdCAtLXdlYnBhY2ssIGEgZmxhZyBOZXh0LmpzIDE1J3MgQ0xJIHJlamVjdHMgYXMgdW5rbm93bi5cbiAgICBsZXQgYnVuZGxlck9wdGlvbiA9ICctLXR1cmJvcGFjayAnO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIGJ1bmRsZXJPcHRpb24gPSBnZXROZXh0TWFqb3JWZXJzaW9uKHByb2plY3QpID49IDE2ID8gJy0td2VicGFjayAnIDogJyc7XG4gICAgfVxuICAgIHJldHVybiBgWUFSTiBuZXh0IGRldiAke2J1bmRsZXJPcHRpb259JHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYFlBUk4gbmV4dCBzdGFydCAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcblxuLyoqXG4gKiBQcmVmZXJzIHRoZSBpbnN0YWxsZWQgcGFja2FnZSBvdmVyIHRoZSBkZWNsYXJlZCBzcGVjaWZpZXIgYmVjYXVzZSB0aGUgZGVjbGFyZWQgb25lIG1heSBiZSBhXG4gKiByYW5nZTsgZmFsbHMgYmFjayB0byAxNSAod2VicGFjay1ieS1kZWZhdWx0IGJlaGF2aW9yKSB3aGVuIG5laXRoZXIgaXMgcmVhZGFibGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5leHRNYWpvclZlcnNpb24ocHJvamVjdDogUHJvamVjdCk6IG51bWJlciB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW5zdGFsbGVkID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ25leHQnLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICApIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIGNvbnN0IG1ham9yID0gc2VtdmVyLmNvZXJjZShpbnN0YWxsZWQudmVyc2lvbik/Lm1ham9yO1xuICAgIGlmIChtYWpvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbWFqb3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVjbGFyZWQgc3BlY2lmaWVyXG4gIH1cbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/Lm5leHQpPy5tYWpvciA/PyAxNTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHZpbmV4dCAoTmV4dC5qcyBvbiBWaXRlKSBhcHBzIHRhcmdldGluZyBDbG91ZGZsYXJlIFdvcmtlcnMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpbmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICAvLyBVbmxpa2UgYG5leHQgZGV2YCwgVml0ZS1iYXNlZCB2aW5leHQgZG9lcyBub3QgcmVhZCB0aGUgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICBjb25zdCBkZXZDb21tYW5kID0gYFlBUk4gdmluZXh0IGRldiAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgIC8vIFRoZSBDbG91ZGZsYXJlIHZpdGUgcGx1Z2luIChtaW5pZmxhcmUpIHJlYWRzIHJ1bnRpbWUgdmFycyBvbmx5IGZyb20gYSAuZGV2LnZhcnMgZmlsZSxcbiAgICAvLyBzbyBpdCBtdXN0IGJlIHJlZ2VuZXJhdGVkIGZyb20gdGhlIGZub3gtbWFuYWdlZCB2YWx1ZXMgYmVmb3JlIHNlcnZpbmcuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIGB2aW5leHQgZGV2YCAobWluaWZsYXJlKSBzdGFydHMgd2l0aCBhbiBlbXB0eSBsb2NhbCBEMSBhbmQgYXBwbGllcyBubyBtaWdyYXRpb25zIGl0c2VsZjtcbiAgICAvLyB0aGUgdGVzdCBlbnZpcm9ubWVudCB3aXBlcyBpdHMgc3RhdGUgZGlyZWN0b3J5LCBzbyBldmVyeSBwYWdlIHdvdWxkIDUwMCB3aXRob3V0IHRoaXMuXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZCA9IGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgPyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobWlncmF0aW9uQ29tbWFuZCkgY29tbWFuZHMucHVzaChtaWdyYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gWy4uLmNvbW1hbmRzLCBkZXZDb21tYW5kXS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgLy8gU2VydmluZyB0aGUgYnVpbHQgd29ya2VyIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IChvciB3aXBlZCkgbG9jYWwgRDEsIHNvIHdyYW5nbGVyLW5hdGl2ZVxuICAgIC8vIG1pZ3JhdGlvbnMgKGlmIGFueSkgbXVzdCBiZSBhcHBsaWVkIGZpcnN0OyBkcml6emxlL3ByaXNtYSBtaWdyYXRpb25zIGFyZSBoYW5kbGVkIGJ5XG4gICAgLy8gYnVpbGRQcm9kdWN0aW9uQ29tbWFuZC5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgLy8gYHZpbmV4dCBidWlsZGAgZW1pdHMgYSB3b3JrZXIgYnVuZGxlIGFuZCBpdHMgd3JhbmdsZXIgY29uZmlnIHVuZGVyIGRpc3Qvc2VydmVyLCBzbyB0aGVcbiAgICAvLyAuZGV2LnZhcnMgZmlsZSBleHBvc2luZyB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IGJlIGdlbmVyYXRlZCBhZnRlciBidWlsZGluZy5cbiAgICAvLyBgLS1sb2NhbC11cHN0cmVhbWAga2VlcHMgcmVxdWVzdCBVUkxzIG9uIHRoZSBsb2NhbCBob3N0OyBvdGhlcndpc2UsIHdyYW5nbGVyIGRldiBzaW11bGF0ZXNcbiAgICAvLyB0aGUgcHJvZHVjdGlvbiBjdXN0b20gZG9tYWluIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgcm91dGVzLlxuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJ2Rpc3Qvc2VydmVyLy5kZXYudmFycycpLFxuICAgICAgLi4uKGQxTWlncmF0aW9uc0NvbW1hbmQgPyBbZDFNaWdyYXRpb25zQ29tbWFuZF0gOiBbXSksXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWNvbmZpZyBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uIC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3BvcnR9IC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tbG9jYWwtdXBzdHJlYW0gbG9jYWxob3N0OiR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aW5leHRTY3JpcHRzID0gbmV3IFZpbmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgSHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChkZXRlY3RlZCB2aWEgYSB3cmFuZ2xlclxuICogY29uZmlnIGZpbGUgd2hlbiBubyBvdGhlciBmcmFtZXdvcmsgbWF0Y2hlczsgdmluZXh0IGFwcHMgaGF2ZSB0aGVpciBvd24gc2NyaXB0cykuXG4gKiBFeHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHNvIHRoYXQgZTJlIHRlc3RzIHJ1biB2aWEgdGhlIHVuaXQtdGVzdCBydW5uZXIgYWdhaW5zdCB0aGUgcnVubmluZ1xuICogd29ya2VyIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vIFBsYXl3cmlnaHQgY29uZmlnLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBXb3JrZXJzU2NyaXB0cyBleHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICAvLyB3cmFuZ2xlciBkZXYgYnVuZGxlcyB0aGUgd29ya2VyIGl0c2VsZiwgc28gbm8gc2VwYXJhdGUgYnVpbGQgc3RlcCBpcyBuZWVkZWQuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnODc4Nyc7XG4gICAgY29uc3Qgc3RhdGVEaXIgPSBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCk7XG5cbiAgICAvLyBUaGVzZSBoZWxwZXJzIHJlYWQgdGhlIGRlZmF1bHQtbmFtZWQgd3JhbmdsZXIgY29uZmlnOyB0aGF0IGlzIHNhZmUgYmVjYXVzZSB3b3JrZXJzU2NyaXB0c1xuICAgIC8vIGl0c2VsZiBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gc3VjaCBhIGNvbmZpZyBmaWxlIGV4aXN0cyBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIEFwcGx5IHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIChpZiBhbnkpIHNvIHRoZSBsb2NhbCBkYXRhYmFzZSBtYXRjaGVzIHRoZSBkZXBsb3llZCBvbmUuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIGlmIChkMU1pZ3JhdGlvbnNDb21tYW5kKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGQxTWlncmF0aW9uc0NvbW1hbmQpO1xuICAgIH1cbiAgICBjb21tYW5kcy5wdXNoKFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gLS1wZXJzaXN0LXRvIFwiJHtzdGF0ZURpcn1cIiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdvcmtlcnNTY3JpcHRzID0gbmV3IFdvcmtlcnNTY3JpcHRzKCk7XG4iLCJpbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuLi8uLi9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4vd29ya2Vyc1NjcmlwdHMuanMnO1xuXG4vKiogUGlja3MgdGhlIHNjcmlwdHMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcm9qZWN0ICh0aGUgc2VsZWN0aW9uIGB3YiB0ZXN0YC9gd2IgdGVzdC1vbi1jaWAgc2hhcmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IEJhc2VTY3JpcHRzIHtcbiAgcmV0dXJuIHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdCkgPz8gKGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlKHByb2plY3QpID8gaHR0cFNlcnZlclNjcmlwdHMgOiBwbGFpbkFwcFNjcmlwdHMpO1xufVxuXG4vKiogVGhlIGZyYW1ld29yay1kZXRlY3Rpb24gcHJlZml4IGV2ZXJ5IGNvbnN1bWVyIHNoYXJlczsgYHdiIHN0YXJ0YCBjb21wb3NlcyBpdHMgb3duIHRhaWwgYXJvdW5kIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IEJhc2VTY3JpcHRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHJldHVybiB2aW5leHRTY3JpcHRzO1xuICBpZiAoZGVwcy5uZXh0KSByZXR1cm4gbmV4dFNjcmlwdHM7XG4gIGlmIChkZXZEZXBzLnZpdGUpIHJldHVybiB2aXRlU2NyaXB0cztcbiAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkgcmV0dXJuIHdvcmtlcnNTY3JpcHRzO1xuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ107XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UsIHNlbGVjdEZyYW1ld29ya1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzIHwgdW5kZWZpbmVkID0gc2VsZWN0RnJhbWV3b3JrU2NyaXB0cyhwcm9qZWN0KTtcbiAgICAgIGlmICghc2NyaXB0cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UocHJvamVjdCkgfHxcbiAgICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgc2VsZWN0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucywgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUuanMnO1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UID0gMjAwO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTyA9IDAuMDU7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOiAnSG93IHRvIHJ1biBFMkUgdGVzdHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGFycmF5OiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnVW5pdCBvciBFMkUgdGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZXN0Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IHR5cGUgVGVzdENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFRlc3RDb21tYW5kT3B0aW9ucz4gJiB7ICctLSc/OiBzdHJpbmdbXSB9O1xuXG5pbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgZW52aXJvbm1lbnQgZWFnZXJseTogd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiBmb3JjZXMgdGhlIHRlc3QgY2FzY2FkZSBhbmRcbiAgICAvLyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiBmYWxscyBiYWNrIFdCX0VOViB0byB0aGF0IG1vZGUg4oCUIGJ1dCB0aGUgZW52IGdldHRlciBpc1xuICAgIC8vIGxhenksIHNvIGEgcHJvamVjdCB3aXRoIG5vIHJ1bm5hYmxlIHRlc3RzIHdvdWxkIG90aGVyd2lzZSBza2lwIHRoZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICAgIHZvaWQgcHJvamVjdC5lbnY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IHNjcmlwdHMgPSBzZWxlY3RTY3JpcHRzKHByb2plY3QpO1xuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmVWaW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmIChzdHJ1Y3R1cmVWaW9sYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdC5uYW1lLCBzdHJ1Y3R1cmVWaW9sYXRpb25zKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGRlZmF1bHRVbml0VGFyZ2V0cyA9IGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0KTtcbiAgICBjb25zdCBleHBsaWNpdFVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgICBjb25zdCB1bml0VGFyZ2V0cyA9IGV4cGxpY2l0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGV4cGxpY2l0VW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHM7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgdW5pdFRhcmdldHMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzIH07XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blVuaXRUZXN0Q29tbWFuZChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgdGltZW91dDogdGVzdEFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICB9KTtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiBpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgLy8gUGxheXdyaWdodCdzIG91dHB1dCBkZWR1cGUgKGZvciBub2lzeSBzZXJ2ZXIgbG9ncykgd291bGQgZHJvcCB0aGUgbmVhci1pZGVudGljYWwgZmFpbHVyZVxuICAgIC8vIGRldGFpbHMgb2YgYSB1bml0LXJ1bm5lciBzdWl0ZSwgc28gcm91dGUgdGhvc2UgdGhyb3VnaCB0aGUgdW5pdCBydW5uZXIncyBvdXRwdXQgaGFuZGxpbmcuXG4gICAgLy8gQSBza2lwLW5vdGljZSBgZWNob2AgbXVzdCBzdGF5IG9uIHRoZSBkZWZhdWx0IHBhdGg6IHRoZSB1bml0IHJ1bm5lcidzIHNpbGVudCBtb2RlIGhpZGVzXG4gICAgLy8gc3VjY2Vzc2Z1bCBvdXRwdXQgYW5kIHdvdWxkIHJlcG9ydCB0aGUgc2tpcHBlZCBzdWl0ZSBhcyBcIkUyRSB0ZXN0cyBwYXNzZWQuXCIuXG4gICAgY29uc3QgcnVuRTJlVGVzdENvbW1hbmQgPSAoXG4gICAgICBzY3JpcHQ6IHN0cmluZyxcbiAgICAgIHsgZXhpdElmRmFpbGVkID0gb3B0aW9ucy5leGl0SWZGYWlsZWQgfTogVGVzdFJ1bk9wdGlvbnMgPSB7fVxuICAgICk6IFByb21pc2U8bnVtYmVyPiA9PlxuICAgICAgc2NyaXB0cy51c2VzVW5pdFJ1bm5lckZvckUyZShwcm9qZWN0KSAmJiAhc2NyaXB0LnN0YXJ0c1dpdGgoJ2VjaG8gJylcbiAgICAgICAgPyBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0LCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkLFxuICAgICAgICAgICAgc2lsZW50U3VjY2Vzc01lc3NhZ2U6ICdFMkUgdGVzdHMgcGFzc2VkLicsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBydW5UZXN0Q29tbWFuZChzY3JpcHQsIHByb2plY3QsIHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZCB9KTtcblxuICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5FMmVUZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5FMmVUZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBydW5FMmVUZXN0Q29tbWFuZCxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgcnVuRTJlVGVzdENvbW1hbmQsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5uZXh0IHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuY2FzY2FkZUVudiB8fCBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPT09IGZhbHNlKSB7XG4gICAgLy8gRXhwbGljaXQgZW52IGZsYWdzIGtlZXAgdGhlaXIgcHJvZmlsZS1zZWxlY3Rpb24gc2VtYW50aWNzLCBidXQgdGhlIHNwYXduZWQgdGVzdHMgbXVzdCBzdGlsbFxuICAgIC8vIHJ1biBhcyBgdGVzdGAgd2hlbiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBkZWZpbmVzIG5vIFdCX0VOViAodGhlIHByZS0xNSBgfHw9ICd0ZXN0J2AgYmVoYXZpb3IpLlxuICAgIHJldHVybiB7IC4uLmFyZ3YsIGNvbW1hbmREZWZhdWx0V2JFbnY6ICd0ZXN0JyB9O1xuICB9XG4gIHJldHVybiB7IC4uLmFyZ3YsIGNhc2NhZGVFbnY6ICd0ZXN0JyB9O1xufVxuXG4vKipcbiAqIFVuaXQgdGVzdHMgbGl2ZSBvbmx5IHVuZGVyIGB0ZXN0L3VuaXQvYDsgYHRlc3QvZGVidWcvYCBydW5zIG9ubHkgd2hlbiBleHBsaWNpdGx5IHRhcmdldGVkLiBCb3RoXG4gKiB2aXRlc3QgYW5kIGBidW4gdGVzdGAgdHJlYXQgYSBiYXJlIGB0ZXN0YCBhcyBhIGZpbGVuYW1lIGZpbHRlciwgd2hpY2ggYWxzbyBtYXRjaGVzIGUuZy5cbiAqIGBzcmMvZm9vLnRlc3QudHNgLCBzbyB0aGUgdHJhaWxpbmcgc2xhc2ggdGhhdCBsaW1pdHMgdGhlIHRhcmdldCB0byB0aGUgZGlyZWN0b3J5IGlzIHJlcXVpcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpID8gWycuL3Rlc3QvdW5pdC8nXSA6IGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHJ1bkUyZVRlc3RDb21tYW5kOiAoc2NyaXB0OiBzdHJpbmcsIG9wdGlvbnM/OiBUZXN0UnVuT3B0aW9ucykgPT4gUHJvbWlzZTxudW1iZXI+LFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIC8vIGV4aXRJZkZhaWxlZCBzdGF5cyBmYWxzZSBzbyB0aGUgRG9ja2VyIGNvbnRhaW5lciBpcyBhbHdheXMgc3RvcHBlZCBiZWxvdy5cbiAgY29uc3QgdGVzdEV4aXRDb2RlID0gYXdhaXQgcnVuRTJlVGVzdENvbW1hbmQoXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgY29uc3Qgc3RvcEV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAodGVzdEV4aXRDb2RlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRlc3RFeGl0Q29kZTtcbiAgfVxuICByZXR1cm4gc3RvcEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBydW5UZXN0Q29tbWFuZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bMl0sXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bM10gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHByb2Nlc3NTaWxlbnRPdXRwdXQ6IGRlZHVwZU5vaXN5VGVzdE91dHB1dCxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blVuaXRUZXN0Q29tbWFuZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bMl0sXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bM10gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YsIHtcbiAgICBvbWl0U2lsZW50U3RhcnQ6IHRydWUsXG4gICAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5OiB0cnVlLFxuICAgIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNczogMTBfMDAwLFxuICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnVW5pdCB0ZXN0cyBwYXNzZWQuJyxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVkdXBlTm9pc3lUZXN0T3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZWR1cGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBpdGVyYXRlTGluZXMob3V0cHV0KSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRMaW5lID0gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZSk7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lU2V0Lmhhcyhub3JtYWxpemVkTGluZSkpIGNvbnRpbnVlO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZXMuc29tZSgocHJpbnRlZExpbmUpID0+IGFyZUxpbmVzU2ltaWxhcihwcmludGVkTGluZSwgbm9ybWFsaXplZExpbmUpKSkgY29udGludWU7XG5cbiAgICBwdXNoUmVjZW50UHJpbnRlZExpbmUocmVjZW50UHJpbnRlZExpbmVzLCByZWNlbnRQcmludGVkTGluZVNldCwgbm9ybWFsaXplZExpbmUpO1xuICAgIGRlZHVwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBkZWR1cGVkTGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uKiBpdGVyYXRlTGluZXMob3V0cHV0OiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBsaW5lU3RhcnRJbmRleCA9IDA7XG4gIHdoaWxlIChsaW5lU3RhcnRJbmRleCA8PSBvdXRwdXQubGVuZ3RoKSB7XG4gICAgY29uc3QgbGluZUVuZEluZGV4ID0gb3V0cHV0LmluZGV4T2YoJ1xcbicsIGxpbmVTdGFydEluZGV4KTtcbiAgICBpZiAobGluZUVuZEluZGV4ID09PSAtMSkge1xuICAgICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCk7XG4gICAgbGluZVN0YXJ0SW5kZXggPSBsaW5lRW5kSW5kZXggKyAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hSZWNlbnRQcmludGVkTGluZShsaW5lczogc3RyaW5nW10sIGxpbmVTZXQ6IFNldDxzdHJpbmc+LCBsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGluZXMucHVzaChsaW5lKTtcbiAgbGluZVNldC5hZGQobGluZSk7XG4gIGlmIChsaW5lcy5sZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UKSByZXR1cm47XG5cbiAgY29uc3QgcmVtb3ZlZExpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICBpZiAocmVtb3ZlZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVTZXQuZGVsZXRlKHJlbW92ZWRMaW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZVxuICAgIC5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL14oPzpcXFtbXlxcXV0rXFxdXFxzKikrL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXChub2RlOlxcZCtcXCkvZywgJyhub2RlOjxudW1iZXI+KScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKyk/Wj9cXGIvZywgJzx0aW1lc3RhbXA+JylcbiAgICAucmVwbGFjZUFsbCgvKFs/Jl1jYWNoZT0pXFxkKy9nLCAnJDE8bnVtYmVyPicpO1xufVxuXG5mdW5jdGlvbiBhcmVMaW5lc1NpbWlsYXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgaWYgKG1heExlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heExlbmd0aCAqIFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZGlzdGFuY2UoYSwgYikgLyBtYXhMZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbi8vIE1hdGNoIHRoZSB0ZXN0L2UyZSBwYXRoIHNlZ21lbnQsIG5vdCB0aGUgJy9lMmUnIHN1YnN0cmluZzogYSB1bml0IHRhcmdldCBzdWNoIGFzXG4vLyB0ZXN0L3VuaXQvZTJlQ29uZmlnLnRlc3QudHMgbXVzdCBub3QgYmUgY2xhc3NpZmllZCBhcyBhbiBlMmUgdGFyZ2V0LlxuY29uc3QgRTJFX1RBUkdFVF9SRUdFWFAgPSAvKD86XnxcXC8pdGVzdFxcL2UyZSg/OlxcL3wkKS87XG5cbmZ1bmN0aW9uIGlzRTJlVGFyZ2V0KHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFMkVfVEFSR0VUX1JFR0VYUC50ZXN0KHRhcmdldCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiBpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgLy8gTm9uLWUyZSB0YXJnZXRzICh0ZXN0L3VuaXQvIGFuZCB0ZXN0L2RlYnVnLykgcnVuIHRocm91Z2ggdGhlIHVuaXQtdGVzdCBydW5uZXIuXG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiAhaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBzZWxlY3RTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vc2VsZWN0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMsIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuaW1wb3J0IHsgZ2V0RGVmYXVsdFVuaXRUYXJnZXRzIH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFNwYXduZWQgY29tbWFuZHMgcmUtZGVyaXZlIHRoZWlyIGVudiBjYXNjYWRlIGZyb20gdGhlIGV4cG9ydGVkIFdCX0VOViwgc28gYW4gdW5leHBvcnRlZFxuICAvLyBXQl9FTlYgd291bGQgbGV0IGEgY29uZmlndXJlZCBXQl9FTlYgZGVmYXVsdCAoZS5nLiBkZXZlbG9wbWVudCkgc2VsZWN0IHRoZSBkZXZlbG9wbWVudFxuICAvLyBlbnZpcm9ubWVudCDigJQgcnVubmluZyB0aGUgZGVzdHJ1Y3RpdmUgZTJlIHN1aXRlIGFnYWluc3QgdGhlIGRldmVsb3BlcidzIG93biBkYXRhYmFzZS5cbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIHByb2plY3QuZW52LkNJIHx8PSAnMSc7XG4gICAgLy8gT3ZlcndyaXRlLCBub3QgfHw9OiBwcm9qZWN0LmVudiBhbHJlYWR5IGNhcnJpZXMgdGhlIGRvdGVudi1kZXJpdmVkIHZhbHVlLlxuICAgIHByb2plY3QuZW52LldCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcblxuICAgIGNvbnN0IHNjcmlwdHMgPSBzZWxlY3RTY3JpcHRzKHByb2plY3QpO1xuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmVWaW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmIChzdHJ1Y3R1cmVWaW9sYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdC5uYW1lLCBzdHJ1Y3R1cmVWaW9sYXRpb25zKTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRG9ja2VyZmlsZSA9IHByb2plY3QuaGFzRG9ja2VyZmlsZTtcbiAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRVbml0VGFyZ2V0cyA9IGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0KTtcbiAgICBpZiAoZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGRlZmF1bHRVbml0VGFyZ2V0cyB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIENvbmZpcm0gZGV2IHNlcnZlciBzdGFydHVwIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcHJvamVjdHMgd2l0aCBFMkUgdGVzdHMuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIC8vIFByZXNlcnZlIGEgbm9uemVybyBleGl0IGNvZGUgZnJvbSBhbiBlYXJsaWVyIHByb2plY3QgKGUuZy4gYSBsYXlvdXQgdmlvbGF0aW9uKTogYSBsYXRlclxuICAgICAgLy8gc3VjY2Vzc2Z1bCBwcm9qZWN0IG11c3Qgbm90IHJlc2V0IHRoZSBmYWlsdXJlLlxuICAgICAgY29uc3QgZTJlRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoZTJlRXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGUyZUV4aXRDb2RlO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBsb2FkZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBidWlsZFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpO1xuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBleGl0Q29kZSBvZiBleGl0Q29kZXMpIHtcbiAgICBpZiAoZXhpdENvZGUpIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHR5cGUtY2hlY2sgY29tbWFuZCB0aGlzIHByb2plY3QgcnVucywgYXMgYEJVTmAvYFlBUk5gLXByZWZpeGVkIHNjcmlwdHMuIEV4cG9ydGVkIHNvXG4gKiBgd2IgdmVyaWZ5YCdzIHN0ZXAgcmVjYXAgY2FuIG5hbWUgdGhlIHNhbWUgdG9vbHMgaW5zdGVhZCBvZiByZS1kZXJpdmluZyB0aGUgY29uZGl0aW9ucywgd2hpY2hcbiAqIHdvdWxkIHNpbGVudGx5IGdvIHN0YWxlIHRoZSBuZXh0IHRpbWUgdGhpcyBsaXN0IGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocHJvamVjdC5oYXNPd25Tb3VyY2VDb2RlKSB7XG4gICAgY29tbWFuZHMucHVzaCguLi5idWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KSk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgfVxuICByZXR1cm4gY29tbWFuZHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YCAoYHRzY2ApOyB3YmZ5IHJlbW92ZXMgdGhlXG4gIC8vIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHByZXZpZXcgZnJvbSBub24tTmV4dC5qcyByZXBvcyAoTmV4dC5qcy1mYW1pbHlcbiAgLy8gcmVwb3Mga2VlcCBpdCBmb3IgYG5leHQgYnVpbGRgKSwgc28gcmVwb3Mgc3RpbGwgb24gdGhlIHByZXZpZXcgc2hvdWxkIHJ1biB3YmZ5XG4gIC8vIGluc3RlYWQgb2YgcmVseWluZyBvbiBhIHRzZ28gZmFsbGJhY2sgaGVyZS5cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5cbmltcG9ydCB7IGJ1aWxkTGludENvbW1hbmQsIGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2LCB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IH0gZnJvbSAnLi90ZXN0LmpzJztcbmltcG9ydCB7IGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMsIHR5cGVDaGVjaywgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiB9IGZyb20gJy4vdHlwZWNoZWNrLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xudHlwZSBQYWNrYWdlQ29tbWFuZEFyZ3YgPSBQaWNrPFZlcmlmeUNvZGVDb21tYW5kQXJndiwgJ2RyeVJ1bicgfCAndmVyYm9zZSc+O1xuXG4vKiogQSBjb21wbGV0ZWQgYHdiIHZlcmlmeWAgc3RlcCwgcmVjb3JkZWQgc28gdGhlIGZpbmFsIHN1bW1hcnkgY2FuIHByb3ZlIGV2ZXJ5IHN0ZXAgYWN0dWFsbHkgcmFuLiAqL1xuaW50ZXJmYWNlIFZlcmlmeVN0ZXAge1xuICAvKipcbiAgICogQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBzdGVwIHJhbiwgZS5nLiBgdHNjIC0tbm9FbWl0YC4gQWdncmVnYXRlZCBhY3Jvc3MgdGhlIGRlc2NlbmRhbnRcbiAgICogcHJvamVjdHMsIHNvIGAgKyBgIG1lYW5zIGVhY2ggdG9vbCByYW4gc29tZXdoZXJlLCBub3QgdGhhdCBvbmUgY29tbWFuZCByYW4gdGhlbSBhbGwuIE9taXR0ZWQgd2hlblxuICAgKiBub3RoaW5nIGJleW9uZCB0aGUgc3RlcCBuYW1lIGRlc2NyaWJlcyBpdC5cbiAgICovXG4gIGRldGFpbD86IHN0cmluZztcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXBzOiBWZXJpZnlTdGVwW10gPSBbXTtcbiAgICBpZiAoYXJndi5mdWxsKSB7XG4gICAgICBhd2FpdCB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndiwgc3RlcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YsIHN0ZXBzKTtcbiAgICAgIHByaW50VmVyaWZ5U3VtbWFyeShzdGVwcywgQm9vbGVhbihhcmd2LmRyeVJ1bikpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsIHN0ZXBzOiBWZXJpZnlTdGVwW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YsIHN0ZXBzKTtcbiAgICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IG5hbWU6ICd0ZXN0JyB9LCAoKSA9PiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KSk7XG4gICAgLy8gUHJpbnRlZCBiZWZvcmUgdGhlIHJlcG9ydGVyIGZpbmlzaGVzIHNvIHRoZSBzdW1tYXJ5IGxhbmRzIGluIHZlcmlmeS1mdWxsLmxvZyB0b28uXG4gICAgcHJpbnRWZXJpZnlTdW1tYXJ5KHN0ZXBzLCBCb29sZWFuKGFyZ3YuZHJ5UnVuKSk7XG4gICAgcmVwb3J0ZXIuc3VjY2VlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydGVyLmZhaWwoZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlcG9ydGVyLmZpbmlzaCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGUocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCBzdGVwczogVmVyaWZ5U3RlcFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGluc3RhbGxgO1xuICAvLyBgYWxsb3dGYWlsdXJlYCBzbyBhIGZhaWxlZCBpbnN0YWxsIHN0aWxsIHJlYWNoZXMgdGhlIG5vcm1hbGl6YXRpb24gYmVsb3c6IGJ1biByZXdyaXRlcyB0aGVcbiAgLy8gbG9ja2ZpbGUgYmVmb3JlIHJ1bm5pbmcgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgc2NyaXB0IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIGxlYXZlIEd1YXJkXG4gIC8vIFVSTHMgaW4gdGhlIHdvcmtpbmcgdHJlZS4gVGhlIGZhaWx1cmUgaXMgcmVwb3J0ZWQgYW5kIGV4aXRzIGV4YWN0bHkgYXMgcnVuUGFja2FnZUNvbW1hbmQgd291bGQuXG4gIGNvbnN0IGluc3RhbGxFeGl0Q29kZSA9IGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBpbnN0YWxsQ29tbWFuZCwgbmFtZTogJ2luc3RhbGwnIH0sICgpID0+XG4gICAgcnVuUGFja2FnZUNvbW1hbmQoaW5zdGFsbENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIHsgYWxsb3dGYWlsdXJlOiB0cnVlIH0pXG4gICk7XG4gIC8vIFRoZSByZXBvc2l0b3J5IG1heSBoYXZlIG5vIGBnZW4tY29kZWAgc2NyaXB0ICh3aGVyZSB0aGUgc2FtZSBub3JtYWxpemF0aW9uIHJ1bnMgYXQgcG9zdGluc3RhbGwpLFxuICAvLyBhbmQgYHZlcmlmeWAgaXMgdGhlIGNvbW1hbmQgYSBkZXZlbG9wZXIgcnVucyBiZWZvcmUgY29tbWl0dGluZy5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHByb2plY3Qucm9vdERpclBhdGgpO1xuICB9XG4gIGlmIChpbnN0YWxsRXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7aW5zdGFsbEV4aXRDb2RlfSk6YCksIGluc3RhbGxDb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGluc3RhbGxFeGl0Q29kZSk7XG4gIH1cbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgY29uc3QgZ2VuQ29kZUNvbW1hbmQgPSBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZ2VuLWNvZGVgO1xuICAgIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBnZW5Db2RlQ29tbWFuZCwgbmFtZTogJ2dlbi1jb2RlJyB9LCAoKSA9PlxuICAgICAgcnVuUGFja2FnZUNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQsIHByb2plY3QsIGFyZ3YpXG4gICAgKTtcbiAgfVxuICAvLyBSZXNvbHZlZCBhZnRlciBgZ2VuLWNvZGVgIHNvIGEgZ2VuZXJhdGVkIGBzcmNgIGRpcmVjdG9yeSBpcyBhbHJlYWR5IHRoZXJlIGZvciBgaGFzU291cmNlQ29kZWAsXG4gIC8vIHdoaWNoIGlzIGFuIGV4aXN0c1N5bmMgY2hlY2ssIGFuZCByZXVzZWQgYnkgYm90aCBzdGVwIGRldGFpbHMgYmVsb3cuIFRoZSBwcm9qZWN0IGZhY3Rvcmllc1xuICAvLyBzaGFyZSBpbnN0YW5jZXMgcGVyIChkaXJlY3RvcnksIGxvYWRFbnYsIGVudi1yZWxldmFudCBhcmd2KSwgc28gYHR5cGVjaGVja2AgcmV1c2VzIHRoaXMgdmVyeVxuICAvLyBncmFwaCB3aGlsZSBgbGludGAgKHdoaWNoIGFkZHMgLS1zaWxlbnQpIHJlc29sdmVzIGl0cyBvd24uXG4gIGNvbnN0IHN0ZXBEZXRhaWxzID0gYXdhaXQgYnVpbGRTdGVwRGV0YWlscyhhcmd2KTtcbiAgLy8gYGxpbnQgLS1maXggLS1mb3JtYXRgIHByaW50cyBub3RoaW5nIG9uIHN1Y2Nlc3MsIHNvIHdpdGhvdXQgdGhlIHN0ZXAgc3VtbWFyeSBhIHBhc3NpbmcgYHZlcmlmeWBcbiAgLy8gbG9va3MgbGlrZSBpdCBuZXZlciBsaW50ZWQgYXQgYWxsIOKAlCBhbmQgaXQgc2lsZW50bHkgcmV3cm90ZSB0aGUgd29ya2luZyB0cmVlIHdoaWxlIGF0IGl0LlxuICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogc3RlcERldGFpbHMuY2xlYW51cCwgbmFtZTogJ2NsZWFudXAnIH0sICgpID0+XG4gICAgcnVuSW5Qcm9jZXNzQ29tbWFuZCgnY2xlYW51cCcsICgpID0+XG4gICAgICBsaW50KHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgXzogWydsaW50J10sXG4gICAgICAgIGZpeDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KVxuICAgIClcbiAgKTtcbiAgLy8gVHlwZS1hd2FyZSBsaW50IHJlcG9ydHMgVHlwZVNjcmlwdCBkaWFnbm9zdGljcyBvbmx5IGZvciB0aGUgZmlsZXMgb3hsaW50IGFjdHVhbGx5IGxpbnRzLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCBjb25maWcgaWdub3JlcyBkaXJlY3RvcmllcyB0c2Mgc3RpbGwgY29tcGlsZXMgKGUuZy4gYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCxcbiAgLy8gYGRpc3RgKS4gS2VlcCB0aGUgdHlwZWNoZWNrIGNvbW1hbmQgc28gYHZlcmlmeWAgc3RheXMgZXF1aXZhbGVudCB0byBcInRoZSByZXBvc2l0b3J5IGNvbXBpbGVzXCIuXG4gIC8vIFRoZSBvdmVybGFwIHdpdGggbGludCBpcyBkZWxpYmVyYXRlOiBgLS10eXBlLWF3YXJlYCBhbHNvIHBvd2VycyB0eXBlLWF3YXJlIGxpbnQgcnVsZXMsIGFuZFxuICAvLyBkcm9wcGluZyBvbmx5IGAtLXR5cGUtY2hlY2tgIGZyb20gbGludCBzYXZlcyB+MC4xcywgZmFyIGxlc3MgdGhhbiB0aGUgY292ZXJhZ2UgaXQgd291bGQgY29zdC5cbiAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IHN0ZXBEZXRhaWxzLnR5cGVjaGVjaywgbmFtZTogJ3R5cGVjaGVjaycgfSwgKCkgPT5cbiAgICBydW5JblByb2Nlc3NDb21tYW5kKCd0eXBlY2hlY2snLCAoKSA9PiB0eXBlQ2hlY2soeyAuLi5hcmd2LCBfOiBbJ3R5cGVjaGVjayddIH0gYXMgdW5rbm93biBhcyBUeXBlQ2hlY2tDb21tYW5kQXJndikpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoe1xuICAgIC4uLmFyZ3YsXG4gICAgXzogWyd0ZXN0J10sXG4gICAgZTJlOiAnaGVhZGxlc3MnLFxuICAgIHNpbGVudDogdHJ1ZSxcbiAgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGRiLXJlc2V0YCwgZmluZFRlc3RQcm9qZWN0KHByb2plY3QsIHRlc3RBcmd2KSwgdGVzdEFyZ3YsIHtcbiAgICBwcmludFJhd091dHB1dDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kVGVzdFByb2plY3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvamVjdCB7XG4gIGNvbnN0IHRlc3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmICghdGVzdFByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2plY3Qgbm90IGZvdW5kOiAke3Byb2plY3QuZGlyUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gdGVzdFByb2plY3Q7XG59XG5cbi8qKlxuICogTmFtZXMgdGhlIHRvb2xzIGJlaGluZCB0aGUgYGNsZWFudXBgIGFuZCBgdHlwZWNoZWNrYCBzdGVwcy5cbiAqXG4gKiBCb3RoIHN0ZXBzIHR5cGUtY2hlY2ssIHdoaWNoIHJlYWRzIGFzIHJlZHVuZGFudCB1bnRpbCB0aGUgcmVjYXAgc2F5cyBob3cgdGhleSBkaWZmZXI6IGBjbGVhbnVwYFxuICogdHlwZS1jaGVja3MgdGhyb3VnaCBveGxpbnQsIHdoaWNoIHNlZXMgb25seSB0aGUgZmlsZXMgaXQgbGludHMgKHRoZSBzaGFyZWQgY29uZmlnIGlnbm9yZXNcbiAqIGBfX2dlbmVyYXRlZF9fYCwgYEB0eXBlc2AsIGBkaXN0YCwgLi4uKSwgd2hpbGUgYHR5cGVjaGVja2AgcnVucyB0aGUgY29tcGlsZXIgb3ZlciB0aGUgd2hvbGVcbiAqIHRzY29uZmlnIHByb2dyYW0uIEV2ZXJ5IGxhYmVsIGlzIGRlcml2ZWQgZnJvbSB0aGUgcmVzb2x2ZWQgcHJvamVjdHMgcmF0aGVyIHRoYW4gaGFyZC1jb2RlZCwgc28gYVxuICogcmVwb3NpdG9yeSB3aG9zZSBgY2xlYW51cGAgcnVucyBmbGFrZTggb3IgYGRhcnQgYW5hbHl6ZWAgaXMgbmV2ZXIgdG9sZCBpdCByYW4gb3hsaW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFN0ZXBEZXRhaWxzKGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8eyBjbGVhbnVwOiBzdHJpbmc7IHR5cGVjaGVjaz86IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNsZWFudXAgPSAnbGludCAtLWZpeCAtLWZvcm1hdCc7XG4gIC8vIERlbGliZXJhdGVseSByZXNvbHZlZCB3aXRoIG5vIGV4cGxpY2l0IGRpclBhdGgsIGV4YWN0bHkgYXMgYGxpbnRgIChsaW50LnRzKSBhbmQgYHR5cGVDaGVja2BcbiAgLy8gKHR5cGVjaGVjay50cykgcmVzb2x2ZSB0aGVpcnMsIHNvIHRoZSBsYWJlbHMgYWx3YXlzIGRlc2NyaWJlIHRoZSB2ZXJ5IHByb2plY3Qgc2V0IHRob3NlIGNvbW1hbmRzXG4gIC8vIHByb2Nlc3MuIFRocmVhZGluZyBhIGRpclBhdGggaW4g4oCUIHRoZSBzZWxmIHByb2plY3Qncywgc2F5IOKAlCB3b3VsZCBsZXQgdGhlIHR3byBkaXZlcmdlLCB3aGljaCBpc1xuICAvLyB0aGUgZHJpZnQgdGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gcHJldmVudC5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykgcmV0dXJuIHsgY2xlYW51cCB9O1xuXG4gIC8vIEFza3MgdGhlIHJlYWwgYnVpbGRlcnMgd2hhdCB0aGV5IHdvdWxkIHJ1biByYXRoZXIgdGhhbiByZXN0YXRpbmcgdGhlaXIgY29uZGl0aW9ucywgc28gYSBjaGFuZ2VcbiAgLy8gdG8gZWl0aGVyIGNvbW1hbmQgY2Fubm90IGxlYXZlIHRoZXNlIGxhYmVscyBkZXNjcmliaW5nIHNvbWV0aGluZyBpdCBzdG9wcGVkIGRvaW5nLiBPbmx5IHRoZVxuICAvLyBwcm9qZWN0IHNlbGVjdGlvbiBpcyByZXN0YXRlZDogYGxpbnRgIGFuZCBgdHlwZUNoZWNrYCBhcHBseSBpdCBhcm91bmQgdGhlaXIgYnVpbGRlcnMsIG5vdFxuICAvLyBpbnNpZGUgdGhlbS5cbiAgY29uc3QgcnVuc1R5cGVBd2FyZUxpbnQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5zb21lKFxuICAgIChwcm9qZWN0KSA9PlxuICAgICAgcHJvamVjdC5oYXNPd25Tb3VyY2VDb2RlICYmIGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgeyBmaXg6IHRydWUsIGZvcm1hdDogdHJ1ZSB9KT8uaW5jbHVkZXMoJy0tdHlwZS1hd2FyZScpXG4gICk7XG4gIGNvbnN0IHR5cGVDaGVja0NvbW1hbmRzID0gW1xuICAgIC4uLm5ldyBTZXQocHJvamVjdHMuZGVzY2VuZGFudHMuZmxhdE1hcCgocHJvamVjdCkgPT4gYnVpbGRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KS5tYXAodG9EaXNwbGF5Q29tbWFuZCkpKSxcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICBjbGVhbnVwOiBydW5zVHlwZUF3YXJlTGludCA/IGAke2NsZWFudXB9IChveGxpbnQgLS10eXBlLWF3YXJlIC0tdHlwZS1jaGVjaylgIDogY2xlYW51cCxcbiAgICB0eXBlY2hlY2s6IHR5cGVDaGVja0NvbW1hbmRzLmxlbmd0aCA+IDAgPyB0eXBlQ2hlY2tDb21tYW5kcy5qb2luKCcgKyAnKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqIERyb3BzIHRoZSBwYWNrYWdlLW1hbmFnZXIgcGxhY2Vob2xkZXIgYHJ1bldpdGhTcGF3bmAgZXhwYW5kcywgbGVhdmluZyB0aGUgdG9vbCBjYWxsIHRvIHNob3cuICovXG5mdW5jdGlvbiB0b0Rpc3BsYXlDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kLnJlcGxhY2UoL14oPzpCVU58WUFSTikgL3UsICcnKTtcbn1cblxuLyoqIFRpbWVzIGEgc3RlcCBhbmQgcmVjb3JkcyBpdCBmb3IgdGhlIGZpbmFsIHN1bW1hcnkuIFN0ZXBzIHRoYXQgZmFpbCBleGl0IHRoZSBwcm9jZXNzIGluc3RlYWQuICovXG5hc3luYyBmdW5jdGlvbiBydW5TdGVwPFQ+KFxuICBzdGVwczogVmVyaWZ5U3RlcFtdLFxuICBzdGVwOiBPbWl0PFZlcmlmeVN0ZXAsICdkdXJhdGlvbk1zJz4sXG4gIHJ1bjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bigpO1xuICBzdGVwcy5wdXNoKHsgLi4uc3RlcCwgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSdW5zIGEgc3RlcCB0aGF0IHN1Y2NlZWRzIHNpbGVudGx5OiB0aGUgcmVjYXAgaXMgdGhlIHNpbmdsZSBwbGFjZSBhIHN1Y2Nlc3NmdWwgc3RlcCBpcyBhbm5vdW5jZWQsXG4gKiBzbyB3cmFwcGVyIGBTdGFydGAvYEZpbmlzaGVkYCBsaW5lcyB3b3VsZCBvbmx5IHJlcGVhdCBpdC4gRmFpbHVyZXMgc3RpbGwgcmVwb3J0IGJlZm9yZSBleGl0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmROYW1lKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUmVjYXBzIGV2ZXJ5IGNvbXBsZXRlZCBzdGVwLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBhbmQgaXRzIHBlci1jb21tYW5kIG91dHB1dCBpcyB1bmV2ZW46IGFcbiAqIHN1Y2Nlc3NmdWwgYGNsZWFudXBgIHByaW50cyBub3RoaW5nIGF0IGFsbCB3aGlsZSBgdHlwZWNoZWNrYCBwcmludHMgcGVyLXBhY2thZ2UgcHJvZ3Jlc3MuIFJlYWRpbmdcbiAqIGEgcGFzc2luZyBydW4gdGhlcmVmb3JlIGdhdmUgbm8gZXZpZGVuY2UgdGhhdCBsaW50aW5nIGhhcHBlbmVkLCBzbyB0aGUgcmVjYXAgbGlzdHMgZWFjaCBzdGVwIHRoYXRcbiAqIHJhbiwgd2hhdCBpdCByYW4sIGFuZCBob3cgbG9uZyBpdCB0b29rLlxuICovXG5mdW5jdGlvbiBwcmludFZlcmlmeVN1bW1hcnkoc3RlcHM6IFZlcmlmeVN0ZXBbXSwgZHJ5UnVuOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChzdGVwcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBuYW1lV2lkdGggPSBNYXRoLm1heCguLi5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAubmFtZS5sZW5ndGgpKTtcbiAgLy8gYC0tZHJ5LXJ1bmAgc2tpcHMgY29tbWFuZCBleGVjdXRpb24sIHNvIGV2ZXJ5IHN0ZXAgdG9vayBubyB0aW1lIGFuZCB2ZXJpZmllZCBub3RoaW5nOiBhIGdyZWVuXG4gIC8vIFwiVmVyaWZpZWRcIiByZWNhcCB3b3VsZCBjbGFpbSBleGFjdGx5IHRoZSB3b3JrIHRoZSBmbGFnIHN1cHByZXNzZWQuIExpc3Qgd2hhdCB3b3VsZCBydW4gaW5zdGVhZC5cbiAgaWYgKGRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRHJ5IHJ1biDigJQgbm90aGluZyB3YXMgZXhlY3V0ZWQuIFN0ZXBzIHRoYXQgd291bGQgcnVuOicpKSk7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgICAvLyBQYWQgb25seSB3aGVuIGEgZGV0YWlsIGZvbGxvd3MsIHNvIGEgZGV0YWlsLWxlc3Mgc3RlcCBkb2VzIG5vdCBlbWl0IHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICBjb25zb2xlLmluZm8oYCAgLSAke3N0ZXAuZGV0YWlsID8gc3RlcC5uYW1lLnBhZEVuZChuYW1lV2lkdGgpICsgY2hhbGsuZ3JheShgICAke3N0ZXAuZGV0YWlsfWApIDogc3RlcC5uYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkdXJhdGlvbnMgPSBzdGVwcy5tYXAoKHN0ZXApID0+IGZvcm1hdFN0ZXBEdXJhdGlvbihzdGVwLmR1cmF0aW9uTXMpKTtcbiAgY29uc3QgZHVyYXRpb25XaWR0aCA9IE1hdGgubWF4KC4uLmR1cmF0aW9ucy5tYXAoKGR1cmF0aW9uKSA9PiBkdXJhdGlvbi5sZW5ndGgpKTtcbiAgY29uc3QgdG90YWxEdXJhdGlvbk1zID0gc3RlcHMucmVkdWNlKCh0b3RhbCwgc3RlcCkgPT4gdG90YWwgKyBzdGVwLmR1cmF0aW9uTXMsIDApO1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5ncmVlbihjaGFsay5ib2xkKGBWZXJpZmllZCBpbiAke2Zvcm1hdFN0ZXBEdXJhdGlvbih0b3RhbER1cmF0aW9uTXMpfTpgKSkpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc3RlcF0gb2Ygc3RlcHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSAoZHVyYXRpb25zW2luZGV4XSBhcyBzdHJpbmcpLnBhZFN0YXJ0KGR1cmF0aW9uV2lkdGgpO1xuICAgIGNvbnN0IGRldGFpbCA9IHN0ZXAuZGV0YWlsID8gYCAgJHtzdGVwLmRldGFpbH1gIDogJyc7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCcgIOKclCAnKSArIHN0ZXAubmFtZS5wYWRFbmQobmFtZVdpZHRoKSArIGNoYWxrLmdyYXkoYCAgJHtkdXJhdGlvbn0ke2RldGFpbH1gKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFja2FnZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAvXig/OmJ1bnx5YXJuKSAoPzppbnN0YWxsfGdlbi1jb2RlKSQvdS50ZXN0KGNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZG91dFdyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRlcnJXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihjaGFsay5ib2xkKCdGdWxsIGxvZzonKSwgbG9nRmlsZVBhdGgpKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBvcmlnaW5hbFN0ZG91dFdyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IG9yaWdpbmFsU3RkZXJyV3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuXG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBmb3JtYXRFbGFwc2VkVGltZShEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdWNjZWVkZWQgPyAnU3VjY2VlZGVkJyA6ICdGYWlsZWQnO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGF0dXN9IGluICR7ZWxhcHNlZFRpbWV9LiBGdWxsIGxvZzogJHtsb2dGaWxlUGF0aH1cXG5gO1xuICAgIGNvbnN0IGNvbG9yZWRTdW1tYXJ5ID0gc3VjY2VlZGVkID8gY2hhbGsuZ3JlZW4oc3VtbWFyeSkgOiBjaGFsay5yZWQoc3VtbWFyeSk7XG4gICAgb3JpZ2luYWxTdGRvdXRXcml0ZShjb2xvcmVkU3VtbWFyeSk7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIHN1bW1hcnkpO1xuICAgIGZzLmNsb3NlU3luYyhsb2dGaWxlKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgZmFpbDogKGVycm9yKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIGZpbmlzaCk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9LFxuICAgIHN1Y2NlZWQ6ICgpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVlV3JpdGUob3JpZ2luYWxXcml0ZTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlLCBsb2dGaWxlOiBudW1iZXIpOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUge1xuICByZXR1cm4gKChcbiAgICBjaHVuazogVWludDhBcnJheSB8IHN0cmluZyxcbiAgICBlbmNvZGluZ09yQ2FsbGJhY2s/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpLFxuICAgIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20oY2h1bmssIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdzdHJpbmcnID8gZW5jb2RpbmdPckNhbGxiYWNrIDogJ3V0ZjgnKVxuICAgICAgICA6IGNodW5rO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBidWZmZXIpO1xuICAgIC8vIFdyaXRlIHRvIHRoZSB0ZXJtaW5hbCB2aWEgdGhlIG9yaWdpbmFsIHN0cmVhbSBtZXRob2Q6IGEgc3luY2hyb25vdXMgZnMud3JpdGVTeW5jIG9uIHRoZVxuICAgIC8vIHN0ZG91dC9zdGRlcnIgZmQgdGhyb3dzIEVBR0FJTiBvbiBDSSdzIG5vbi1ibG9ja2luZyBwaXBlcyB3aGVuIGxhcmdlIG91dHB1dCBmbHVzaGVzIGF0IG9uY2UsXG4gICAgLy8gd2hpbGUgdGhlIHN0cmVhbSBtZXRob2QgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBoYW5kbGVzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gb3JpZ2luYWxXcml0ZShidWZmZXIsIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiBjYWxsYmFjayk7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuLyoqIFN1Yi1taW51dGUgc3RlcHMga2VlcCBvbmUgZGVjaW1hbCBzbyBhIGZhc3Qgc3RlcCBpcyBub3QgZmxhdHRlbmVkIHRvIGEgbWlzbGVhZGluZyBgMHNgLiAqL1xuZnVuY3Rpb24gZm9ybWF0U3RlcER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1pbGxpc2Vjb25kcyA8IDYwXzAwMCkge1xuICAgIHJldHVybiBgJHsobWlsbGlzZWNvbmRzIC8gMTAwMCkudG9GaXhlZCgxKX1zYDtcbiAgfVxuICByZXR1cm4gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBwcm90ZWN0UnVuU2NyaXB0QXJncyB9IGZyb20gJy4uL2Jpbi9ydW5BcmdzLmpzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNoZWNrRW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY2hlY2tFbnYuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGRlcGxveUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBkb3RlbnZDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kb3RlbnYuanMnO1xuaW1wb3J0IHsgZ2VuQ29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkNvZGUuanMnO1xuaW1wb3J0IHsgZ2VuRGV2VmFyc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkRldlZhcnMuanMnO1xuaW1wb3J0IHsgZ2VuRG9ja2VyRW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRG9ja2VyRW52LmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBtYWludGVuYW5jZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL21haW50ZW5hbmNlLmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByYWlsd2F5RW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmFpbHdheUVudi5qcyc7XG5pbXBvcnQgeyByZWxlYXNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmVsZWFzZS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxucHJvdGVjdFJ1blNjcmlwdEFyZ3MocHJvY2Vzcy5hcmd2KTtcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBvbmx5IHdoZW4gYSBzaGltIGFjdHVhbGx5IHdpbnMgYG5vZGVgIHJlc29sdXRpb246IG92ZW4vYnVuIGltYWdlcyBhcHBlbmQgYSBoYXJtbGVzc1xuICAgIC8vIC91c3IvbG9jYWwvYnVuLW5vZGUtZmFsbGJhY2stYmluIChub2RlIC0+IGJ1bikgYXQgdGhlIEVORCBvZiBQQVRILCBzbyBhIFBBVEggc3Vic3RyaW5nXG4gICAgLy8gY2hlY2sgZmFsc2UtcG9zaXRpdmVzIHdoZW5ldmVyIGEgcmVhbCBub2RlIHByZWNlZGVzIGl0LlxuICAgIGNvbnN0IG5vZGVPblBhdGggPSBmaW5kRmlyc3ROb2RlT25QYXRoKCk7XG4gICAgaWYgKG5vZGVPblBhdGggJiYgaXNCdW5Ob2RlU2hpbShub2RlT25QYXRoKSkge1xuICAgICAgLy8gTm90IGZpeGVkIHVwIGhlcmU6IHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpIG1heSBoYW5nIG9yXG4gICAgICAvLyBjcmFzaCB1bmRlciB0aGUgc2hpbSwgYW5kIHNvbWUgKHdyYW5nbGVyIGRldikgZmFpbCBzaWxlbnRseSwgc28gc3VyZmFjZSB0aGUgY2F1c2UgdXBmcm9udC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFdhcm5pbmc6IFxcYG5vZGVcXGAgb24gUEFUSCBpcyBhIEJ1biBzaGltICgke25vZGVPblBhdGh9KTsgYCArXG4gICAgICAgICAgJ3J1biB3YiB3aXRob3V0IGAtLWJ1bmAgYW5kIHJlbW92ZSBgW3J1bl0gYnVuYCBmcm9tIGJ1bmZpZy50b21sLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YuX1swXSAhPT0gJ3J1bicpIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY2hlY2tFbnZDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAuY29tbWFuZChkb3RlbnZDb21tYW5kKVxuICAuY29tbWFuZChnZW5Db2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuRGV2VmFyc0NvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRvY2tlckVudkNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChtYWludGVuYW5jZUNvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyYWlsd2F5RW52Q29tbWFuZClcbiAgLmNvbW1hbmQocmVsZWFzZUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQocnVuQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG4vKiogVGhlIGZpcnN0IGV4ZWN1dGFibGUgYG5vZGVgIG9uIFBBVEgsIGkuZS4gdGhlIG9uZSBjaGlsZCBwcm9jZXNzZXMgd2lsbCBydW4uICovXG5mdW5jdGlvbiBmaW5kRmlyc3ROb2RlT25QYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgZGlyIG9mIChwcm9jZXNzLmVudi5QQVRIID8/ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICBpZiAoIWRpcikgY29udGludWU7XG5cbiAgICBjb25zdCBub2RlUGF0aCA9IHBhdGguam9pbihkaXIsICdub2RlJyk7XG4gICAgdHJ5IHtcbiAgICAgIGZzLmFjY2Vzc1N5bmMobm9kZVBhdGgsIGZzLmNvbnN0YW50cy5YX09LKTtcbiAgICAgIC8vIFhfT0sgYWxzbyBwYXNzZXMgZm9yIHNlYXJjaGFibGUgZGlyZWN0b3JpZXMsIHdoaWNoIGV4ZWN2cCBza2lwcy5cbiAgICAgIGlmIChmcy5zdGF0U3luYyhub2RlUGF0aCkuaXNGaWxlKCkpIHJldHVybiBub2RlUGF0aDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vdCBwcmVzZW50IG9yIG5vdCBleGVjdXRhYmxlIGluIHRoaXMgZGlyZWN0b3J5OyBrZWVwIHNlYXJjaGluZy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNCdW5Ob2RlU2hpbShub2RlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBidW4gLS1idW5gIGFuZCBidW5maWcncyBgcnVuLmJ1bmAgcHJlcGVuZCBhIGJ1bi1ub2RlLTx2ZXJzaW9uPiBkaXJlY3Rvcnkgd2hvc2UgYG5vZGVgIGxpbmtzXG4gIC8vIHRvIGJ1biwgYW5kIG92ZW4vYnVuIGltYWdlcyBzeW1saW5rIG5vZGUgLT4gYnVuIGluIGJ1bi1ub2RlLWZhbGxiYWNrLWJpbiwgc28gdGhlIGdpdmVhd2F5IGlzXG4gIC8vIGVpdGhlciBhIGJ1bi1ub2RlLSBwYXRoIHNlZ21lbnQgb3IgYSByZXNvbHV0aW9uIHRvIHRoZSBidW4gYmluYXJ5IGl0c2VsZi5cbiAgLy8gU2hpbXMgbGl2ZSBkaXJlY3RseSBpbiBhIGJ1bi1ub2RlLTx2ZXJzaW9uPiBkaXJlY3RvcnksIHNvIGNoZWNrIG9ubHkgdGhlIGltbWVkaWF0ZSBwYXJlbnRcbiAgLy8gKHJlbGF0aXZlIFBBVEggZW50cmllcyBpbmNsdWRlZCk6IG1hdGNoaW5nIGFuY2VzdG9ycyB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBlLmcuIGEgcmVhbCBub2RlXG4gIC8vIGluc2lkZSBhIGJ1bi1ub2RlLXdvcmtzcGFjZSBjaGVja291dC5cbiAgaWYgKHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKG5vZGVQYXRoKSkuc3RhcnRzV2l0aCgnYnVuLW5vZGUtJykpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGZzLnJlYWxwYXRoU3luYyhub2RlUGF0aCkpID09PSAnYnVuJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls5LDEwLDExLDEyLDEzXSwibWFwcGluZ3MiOiI4MkJBZUEsU0FBZ0IsRUFBb0MsRUFBbUMs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QUNGOzs7Ozs7Ozs7QUM1Q0EsTUFBTUMsRUFBRSxNQUFNLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRUMsR0FBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxXQUFXLFdBQVcsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLFdBQVcsTUFBTSxXQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxXQUFXLE1BQU0sV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUUsV0FBVyxXQUFXLFdBQVcsV0FBVyxNQUFNLFdBQVcsV0FBVyxFQUFFLFdBQVcsVUFBVSxDQUFDLEVBQUVDLEdBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRUMsR0FBRSxJQUFJLFdBQVcsRUFBRSxFQUFFQyxHQUFFLElBQUksWUFBWSxJQUFJLEVBQUUsSUFBSSxXQUFXLElBQUksRUFBRSxHQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxXQUFXLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsR0FBRSxFQUFFLENBQUMsSUFBSSxFQUFFQSxHQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUVGLEdBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFQyxHQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxXQUFXLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHSCxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLElBQUlBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksSUFBSUEsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFHLEdBQUcsRUFBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRyxHQUFHLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsRUFBRyxFQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRyxFQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUUsR0FBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUcsR0FBSSxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUssSUFBSSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxHQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBRyxFQUFFLElBQUksRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEVBQUUsR0FBSSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRSxFQUFFLEdBQUUsRUFBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxFQUFHLElBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRyxHQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxFQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSyxHQUFHLEdBQUcsR0FBSSxHQUFHLEtBQUssR0FBRyxFQUFHLElBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsR0FBSSxFQUFFLElBQUssR0FBRyxHQUFHLEdBQUksRUFBRSxJQUFLLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEVBQUcsR0FBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUcsSUFBRyxHQUFHLElBQUksRUFBRSxFQUFHLEdBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxJQUFLLEdBQUcsR0FBRyxHQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRSxFQUFFLENBQUMsRUFBRSxFQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsRUFBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUcsRUFBRyxHQUFHLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsRUFBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFFLEVBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRSxHQUFFLEVBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsR0FBRyxFQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUUsRUFBRSxHQUFFLEVBQUcsQ0FBQyxFQUFFLEVBQUcsR0FBRSxHQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsR0FBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxFQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRyxFQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFHQyxHQUFFLEdBQUcsSUFBR0EsR0FBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0NScjJJLE1BQU0sR0FBRUksR0FBRSxFQUFFQyxHQUFFLElBQUksWUFBWUMsR0FBRSxJQUFJLFlBQVksT0FBTyxFQUFFLFNBQVNGLElBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFLLElBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxJQUFLLEtBQUksRUFBRSxRQUFRLElBQUssSUFBRyxFQUFFLEtBQUssSUFBSyxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFLLEdBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFLLEtBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxXQUFXLEtBQUssR0FBRyxDQUFDLEtBQUtFLEdBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLRCxHQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsSUFBSSxJQUFJLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0NBajBCLFNBQVMsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLE9BQU8sS0FBSyxVQUFVRSxHQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTQyxHQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSyxHQUFFLE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxPQUFPLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTRCxHQUFFLEVBQUUsRUFBRSxHQUFFLENBQUMsSUFBSSxFQUFFQyxHQUFFLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUVBLEdBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxLQUFLLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSyxHQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLE9BQU8sRUFBekIsQ0FBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsT0FBTyxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUssR0FBRSxHQUFHLElBQUksSUFBSyxHQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQ0F0OEIsU0FBU0MsR0FBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPQyxHQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBaUMsU0FBU0MsSUFBRyxDQUFDLE1BQU0sRUFBRSxDQ0ExRixNQUFNLEVBQUUsR0FBRSxDQUFDLFlBQVlDLEVBQUMsQ0FBQyxFQUFJLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBRSxTQUFTLEdBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUVELElBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHLE9BQU8sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFD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
|
|
119
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJub3JtYWxpemVCdW5Mb2NrZmlsZSIsInN0YW5kYXJkV2JFbnZNb2RlcyIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwicnVuQ29tbWFuZCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsImUiLCJ0IiwibiIsInIiLCJpIiwiciIsInQiLCJuIiwiciIsIm4iLCJuIiwiZSIsImkiLCJ0IiwiZSIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImFyZ3VtZW50c0J1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJwYXJzZSIsImRlcGxveUNvbW1hbmQiLCJub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSIsInBhcnNlVG9tbCIsImJ1aWxkZXIiLCJwYXJzZURvdGVudiIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZGVwbG95Q29tbWFuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi9iaW4vcnVuQXJncy5qcyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL2NvbnN0cnVjdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2dldENhY2hlS2V5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplT25lLmpzIiwiLi4vc3JjL3V0aWxzL2JpblBhdGgudHMiLCIuLi9zcmMvdXRpbHMvY2kudHMiLCIuLi9zcmMvdXRpbHMvZW52U291cmNlcy50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NoZWNrRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL2xpdGVzdHJlYW0udHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9idW5Mb2NrZmlsZS50cyIsIi4uL3NyYy91dGlscy9mbm94VG9tbC50cyIsIi4uL3NyYy91dGlscy93b3JrZXJUeXBlc0Vudi50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuRG9ja2VyRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9vdXRwdXQudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvY29tbWFuZHMvbWFpbnRlbmFuY2UudHMiLCIuLi9zcmMvdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yYWlsd2F5RW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JlbGVhc2UudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEEgc2libGluZyB0ZW1wIGZpbGUgbWFrZXMgdGhlIHJlcGxhY2VtZW50IGFuIGF0b21pYyBzYW1lLWRpcmVjdG9yeSByZW5hbWUsIHNvIGFuIGludGVycnVwdGVkXG4gIC8vIHdyaXRlIGNhbm5vdCBsZWF2ZSBhIHRydW5jYXRlZCBidW4ubG9jayBiZWhpbmQuXG4gIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHtsb2NrZmlsZVBhdGh9Lm5vcm1hbGl6aW5nLiR7cHJvY2Vzcy5waWR9LiR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICB0cnkge1xuICAgIC8vIHN0YXQncyBtb2RlIGluY2x1ZGVzIGZpbGUtdHlwZSBiaXRzLCB3aGljaCBjaG1vZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGFjY2VwdC5cbiAgICBjb25zdCBtb2RlID0gZnMuc3RhdFN5bmMobG9ja2ZpbGVQYXRoKS5tb2RlICYgMG83Nzc7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wb3JhcnlQYXRoLCBub3JtYWxpemVkQ29udGVudCwgeyBtb2RlIH0pO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMncyBtb2RlIGlzIG1hc2tlZCBieSB0aGUgcHJvY2VzcyB1bWFzazsgY2htb2QgcmVzdG9yZXMgdGhlIGV4YWN0IG9yaWdpbmFsIGJpdHMuXG4gICAgZnMuY2htb2RTeW5jKHRlbXBvcmFyeVBhdGgsIG1vZGUpO1xuICAgIGZzLnJlbmFtZVN5bmModGVtcG9yYXJ5UGF0aCwgbG9ja2ZpbGVQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmModGVtcG9yYXJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IChmbm94IHByb2ZpbGUgLyBtaXNlIGVudikgdG8gbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBsb2FkaW5nIGluZm9ybWF0aW9uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PiAmIHtcbiAgLyoqXG4gICAqIENvbW1hbmQtbGV2ZWwgZmFsbGJhY2sgZm9yIGFuIHVuc2V0IFdCX0VOViAoZS5nLiBgd2IgdGVzdGAgc3VwcGxpZXMgJ3Rlc3QnIHdoZW4gZXhwbGljaXQgZW52XG4gICAqIGZsYWdzIHN1cHByZXNzIGl0cyBkZWZhdWx0IHRlc3QgY2FzY2FkZSkuIE5vdCBhIENMSSBmbGFnLlxuICAgKi9cbiAgY29tbWFuZERlZmF1bHRXYkVudj86IHN0cmluZztcbn07XG5cbmNvbnN0IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY2FzY2FkZSAoZm5veCBwcm9maWxlIC8gZW52LWZpbGUgc3VmZml4KSB0aGUgcmVhZGVyIGxvYWRzIGZvciB0aGUgZ2l2ZW4gb3B0aW9uczpcbiAqIHRoZSBmb3JjZWQgYC0tY2FzY2FkZS1lbnZgIGZpcnN0LCB0aGVuIGAtLWNhc2NhZGUtbm9kZS1lbnZgJ3MgTk9ERV9FTlYsIHRoZW4gdGhlIGF1dG8gY2FzY2FkZVxuICogZHJpdmVuIGJ5IHRoZSBhbWJpZW50IFdCX0VOVi9OT0RFX0VOVi4gRXhwb3J0ZWQgc28gY29tbWFuZHMgdGhhdCBzZWxlY3QgYSBwcm9maWxlIFdJVEhPVVRcbiAqIGxvYWRpbmcgZW52aXJvbm1lbnQgc291cmNlcyAoZS5nLiBgd2IgZ2VuLWRvY2tlci1lbnZgKSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUgcmVhZGVyJ3Mgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhc2NhZGUoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCBhbiBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyIGV4cHJlc3Npb246XG4gIC8vIGJ1bmRsZXJzIHJlcGxhY2UgdGhhdCBleGFjdCBleHByZXNzaW9uIGF0IGJ1aWxkIHRpbWUgKHNlZSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMpLlxuICBjb25zdCBydW50aW1lRW52ID0gcHJvY2Vzcy5lbnY7XG4gIHJldHVybiAoXG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFdCX0VOViB2YWx1ZSB3YiBmYWxscyBiYWNrIHRvIHdoZW4gbm8gZW52IHNvdXJjZSBhbmQgbm8gZXhwb3J0ZWQgdmFyaWFibGUgZGVmaW5lc1xuICogaXQ6IHRoZSBjb21tYW5kLWxldmVsIGRlZmF1bHQgZmlyc3QgKGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2AgbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXNcbiAqIGJ1dCBpdHMgdGVzdHMgbXVzdCBzdGlsbCBydW4gYXMgYHRlc3RgLCBtaXJyb3JpbmcgdGhlIHByZS0xNSBgfHw9ICd0ZXN0J2AgYmVoYXZpb3IpLCB0aGVuIHRoZVxuICogZm9yY2VkIGNhc2NhZGUsIHRoZW4gdGhlIGFtYmllbnQtTk9ERV9FTlYtZHJpdmVuIGF1dG8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYVxuICogbm9uLXN0YW5kYXJkIE5PREVfRU5WIHN1Y2ggYXMgYHFhYCBzdGlsbCBzZWxlY3RzIHRoZSBjYXNjYWRlIHN1ZmZpeCwgYnV0IG11c3Qgbm90IHByb2R1Y2UgYVxuICogbm9uLXN0YW5kYXJkIFdCX0VOVikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmFsbGJhY2tXYkVudihhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGFyZ3YuY29tbWFuZERlZmF1bHRXYkVudikgcmV0dXJuIGFyZ3YuY29tbWFuZERlZmF1bHRXYkVudjtcbiAgaWYgKGFyZ3YuY2FzY2FkZUVudikgcmV0dXJuIGFyZ3YuY2FzY2FkZUVudjtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIHRoZSBhbGlhcyBmb3IgdGhlIHNhbWUgYnVuZGxlci1pbmxpbmluZyByZWFzb24gYXMgaW5cbiAgLy8gcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBhbmQgZnJvbSB0aGUgQU1CSUVOVCBlbnZpcm9ubWVudCAobm90IGxvYWRlZCBmaWxlcykgYmVjYXVzZSB0aGVcbiAgLy8gY2FzY2FkZSBzZWxlY3Rpb24gYmVsb3cgdXNlcyB0aGUgYW1iaWVudCB2YWx1ZSBhcyB3ZWxsLlxuICBjb25zdCBydW50aW1lRW52ID0gcHJvY2Vzcy5lbnY7XG4gIGNvbnN0IGRlcml2ZWQgPVxuICAgIGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiAnZGV2ZWxvcG1lbnQnO1xuICByZXR1cm4gc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhkZXJpdmVkKSA/IGRlcml2ZWQgOiAnZGV2ZWxvcG1lbnQnO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gYW5kIG1pc2UuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52U291cmNlTmFtZXMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIC8qKlxuICAgICAqIExvYWQgdmFyaWFibGVzIGV2ZW4gaWYgdGhleSBhbHJlYWR5IGV4aXN0IGluIHByb2Nlc3MuZW52LlxuICAgICAqIFVzZWZ1bCB3aGVuIGEgcGFyZW50IHByb2Nlc3MgaGFzIGFscmVhZHkgaW5qZWN0ZWQgdGhlIGZub3ggdmFsdWVzIGludG8gdGhlIGVudmlyb25tZW50XG4gICAgICogYW5kIHRoZSBjb25maWd1cmVkIHZhcmlhYmxlcyB0aGVtc2VsdmVzIGFyZSBuZWVkZWQgKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApLlxuICAgICAqL1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEV4cGFuZCBgJHtXQl9FTlZ9YCByZWZlcmVuY2VzIGFnYWluc3QgdGhlIGZhbGxiYWNrIG1vZGUgd2hlbiBub3RoaW5nIGRlZmluZXMgV0JfRU5WLlxuICAgICAqIE9ubHkgZm9yIGNhbGxlcnMgdGhhdCBzdWJzZXF1ZW50bHkgQ09NUExFVEUgV0JfRU5WIHdpdGggdGhhdCBmYWxsYmFjayAod2IncyBQcm9qZWN0LmVudikuXG4gICAgICovXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudj86IGJvb2xlYW47XG4gIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICAvLyBSZWFkIE5PREVfRU5WIHRocm91Z2ggYW4gYWxpYXMsIG5ldmVyIGFzIHRoZSBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIG1lbWJlciBleHByZXNzaW9uOlxuICAvLyBidW5kbGVycyByZXBsYWNlIHRoYXQgZXhhY3QgZXhwcmVzc2lvbiBhdCBidWlsZCB0aW1lIChyb2xsZG93bi9idWlsZC10cyBpbmxpbmUgaXQgYXNcbiAgLy8gJ3Byb2R1Y3Rpb24nKSwgd2hpY2ggY29uc3RhbnQtZm9sZHMgdGhlIGZhbGxiYWNrIGJlbG93IGFuZCBtYWRlIHRoZSBwdWJsaXNoZWQgd2Igc2VsZWN0XG4gIC8vIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgd2hlbmV2ZXIgV0JfRU5WIHdhcyB1bnNldC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBjYXNjYWRlID0gcmVzb2x2ZUNhc2NhZGUoYXJndik7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtydW50aW1lRW52LldCX0VOVn0sIE5PREVfRU5WOiAke3J1bnRpbWVFbnYuTk9ERV9FTlZ9YCk7XG4gIH1cblxuICAvLyBXaGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBmb3JjZXMgYSBtb2RlICgtLWNhc2NhZGUtZW52IC8gLS1jYXNjYWRlLW5vZGUtZW52IC8gYW4gZXhwb3J0ZWRcbiAgLy8gV0JfRU5WKSwgdmFsdWVzIHRoYXQgdGhlIG1vZGUncyBvd24gZm5veCBwcm9maWxlIGRlZmluZXMgbXVzdCB3aW4gb3ZlciB2YXJpYWJsZXMgaW5oZXJpdGVkXG4gIC8vIGZyb20gdGhlIHBhcmVudCBzaGVsbDogYSBzdGFsZSBgZXhwb3J0IERBVEFCQVNFX1VSTD0uLi5gIGZyb20gYSBkZXZlbG9wbWVudCBzaGVsbCBtdXN0IG5vdFxuICAvLyBsZWFrIGludG8gYHdiIHRlc3RgJ3MgdGVzdCBtb2RlIChjZi4gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTMwKS4gT24gQ0lcbiAgLy8gdGhlIGluaGVyaXRlZCB2YXJpYWJsZXMga2VlcCB3aW5uaW5nIOKAlCB3b3JrZmxvd3MgZGVsaWJlcmF0ZWx5IGluamVjdCBlbnYgdmFycyB0aGF0IG92ZXJyaWRlXG4gIC8vIHRoZSBjb21taXR0ZWQgdmFsdWVzIOKAlCBhbmQgdGhhdCBzaGFkb3dpbmcgaXMgdGhlIGRlc2lnbmVkIGJlaGF2aW9yLlxuICBjb25zdCBtb2RlSXNGb3JjZWQgPSBCb29sZWFuKFxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52ID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogYXJndi5hdXRvQ2FzY2FkZUVudiA/IHJ1bnRpbWVFbnYuV0JfRU5WIDogdW5kZWZpbmVkKVxuICApO1xuICBjb25zdCBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBtb2RlSXNGb3JjZWQgJiYgIWlzQ0lFbnZpcm9ubWVudChydW50aW1lRW52LkNJKTtcblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgcHJvamVjdEhhc0Zub3hDb25maWcgPSBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpO1xuICBjb25zdCBbZm5veEVudlZhcnMsIGZub3hFbnZWYXJOYW1lc10gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52LFxuICAgIGhhc0Zub3hDb25maWc6IHByb2plY3RIYXNGbm94Q29uZmlnLFxuICB9KTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBmbm94RW52VmFycyk7XG4gIC8vIFJlcG9ydCB0aGUgZm5veCBzb3VyY2Ugd2hlbmV2ZXIgZm5veC50b21sIGV4aXN0cyDigJQgZXZlbiB3aGVuIGl0IHlpZWxkcyBubyBrZXlzIChhbGwgc2hhZG93ZWQsXG4gIC8vIGVtcHR5IHByb2ZpbGUsIG9yIGEgZmFpbGluZyBleHBvcnQpOiBjb25zdW1lcnMgc3VjaCBhcyB3YidzIHJlcXVpcmVkLWVudmlyb25tZW50IHZhbGlkYXRpb25cbiAgLy8gbXVzdCBzZWUgdGhhdCBhIGRlY2xhcmVkIGVudiBzb3VyY2UgZXhpc3RzIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgb3Blbi5cbiAgaWYgKGZub3hFbnZWYXJOYW1lcy5sZW5ndGggPiAwIHx8IHByb2plY3RIYXNGbm94Q29uZmlnKSB7XG4gICAgY29uc3QgZm5veFNvdXJjZU5hbWUgPSBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpO1xuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtmbm94U291cmNlTmFtZSwgZm5veEVudlZhck5hbWVzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2Zub3hFbnZWYXJOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7Zm5veFNvdXJjZU5hbWV9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaXNlRW52VmFycywgbWlzZUVudlZhck5hbWVzXSA9IHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBjYXNjYWRlLCBlbnZWYXJzLCBvcHRpb25zKTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBtaXNlRW52VmFycyk7XG4gIGlmIChtaXNlRW52VmFyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1pc2VTb3VyY2VOYW1lID0gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKTtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbbWlzZVNvdXJjZU5hbWUsIG1pc2VFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHttaXNlRW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke21pc2VTb3VyY2VOYW1lfWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgc291cmNlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBhbmQgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBsaXZlIGVudmlyb25tZW50IGZvciBrZXlzIE5PVCBsb2FkZWQgZnJvbSBmaWxlcywgc28gdGhhdCBhXG4gIC8vIHJlZmVyZW5jZSB0byBhbiBleHBvcnRlZCBrZXkgKGV4Y2x1ZGVkIGZyb20gZW52VmFycyBieSBwcm9jZXNzLWVudiBwcmVjZWRlbmNlKSByZXNvbHZlcyB0b1xuICAvLyB0aGUgZWZmZWN0aXZlIHZhbHVlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLiBMb2FkZWQga2V5cyBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tXG4gIC8vIHRoZSByZWZlcmVuY2Ugc2V0OiBkb3RlbnYtZXhwYW5kIHdvdWxkIG90aGVyd2lzZSByZXBsYWNlIHRoZWlyIHBhcnNlZCB2YWx1ZXMgd2l0aCB0aGVcbiAgLy8gcHJvY2VzcyB2YWx1ZXMsIGJyZWFraW5nIGNhbGxlcnMgdGhhdCBuZWVkIHRoZSBmaWxlLWRlZmluZWQgdmFsdWVzIHRoZW1zZWx2ZXMuXG4gIGNvbnN0IHJlZmVyZW5jZUVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAvLyBFc2NhcGUgZG9sbGFyIHNpZ25zIHNvIGRvdGVudi1leHBhbmQgc3Vic3RpdHV0ZXMgZXhwb3J0ZWQgdmFsdWVzIGxpdGVyYWxseSBpbnN0ZWFkIG9mXG4gICAgLy8gcmVjdXJzaXZlbHkgcmUtZXhwYW5kaW5nIHRoZW0gKGFuIGV4cG9ydGVkIGBwYSR3b3JkYCBtdXN0IHN0YXkgYHBhJHdvcmRgKS5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBlbnZWYXJzKSkgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgfVxuICAvLyBkb3RlbnYtZXhwYW5kIHJlc29sdmVzIHJlZmVyZW5jZXMgaW4ga2V5LWluc2VydGlvbiBvcmRlciwgc28gYSBmbm94IHZhbHVlIHJlZmVyZW5jaW5nIGFcbiAgLy8gbWlzZS1wcm92aWRlZCBrZXkgd291bGQgc2VlIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbWlzZSBlbnRyaWVzIHN0YXllZCBhcHBlbmRlZCBhZnRlciB0aGVcbiAgLy8gZm5veCBlbnRyaWVzLiBSZWJ1aWxkIHRoZSBleHBhbnNpb24gaW5wdXQgd2l0aCB0aGUgbG93ZXItcHJpb3JpdHkgc291cmNlcyBmaXJzdDsgdGhlIHZhbHVlc1xuICAvLyB0aGVtc2VsdmVzIGFscmVhZHkgcmVmbGVjdCB0aGUgaW50ZW5kZWQgZm5veC1vdmVyLW1pc2UgcHJlY2VkZW5jZS5cbiAgY29uc3Qgb3JkZXJlZEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWy4uLm1pc2VFbnZWYXJOYW1lcywgLi4uZm5veEVudlZhck5hbWVzXSkgb3JkZXJlZEVudlZhcnNba2V5XSA9IGVudlZhcnNba2V5XSE7XG4gIE9iamVjdC5hc3NpZ24ob3JkZXJlZEVudlZhcnMsIGVudlZhcnMpO1xuICAvLyBleHBhbmQoKSBtdXRhdGVzIEJPVEggaXRzIHBhcnNlZCBpbnB1dCBBTkQgcHJvY2Vzc0VudiAoZG90ZW52LWV4cGFuZCB3cml0ZXMgZXZlcnkgcGFyc2VkXG4gIC8vIHJlc3VsdCBpbnRvIHByb2Nlc3NFbnYpLCBzbyBzbmFwc2hvdCBib3RoIGZvciB0aGUgcmUtZXhwYW5zaW9uIGJlbG93IOKAlCB0aGUgcmV0cnkgbXVzdCBub3RcbiAgLy8gc2VlIHRoZSBmaXJzdCBwYXNzJ3Mgc3RhbGUgZGVwZW5kZW50IHZhbHVlcy5cbiAgY29uc3QgcHJlRXhwYW5zaW9uRW52VmFycyA9IHsgLi4ub3JkZXJlZEVudlZhcnMgfTtcbiAgY29uc3QgcHJpc3RpbmVSZWZlcmVuY2VFbnYgPSB7IC4uLnJlZmVyZW5jZUVudiB9O1xuICBsZXQgZXhwYW5kZWRFbnZWYXJzID0gZXhwYW5kKHsgcGFyc2VkOiBvcmRlcmVkRW52VmFycywgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBvcmRlcmVkRW52VmFycztcbiAgLy8gQSB2YWx1ZSByZWZlcmVuY2luZyAke1dCX0VOVn0gbXVzdCBleHBhbmQgdG8gd2hhdCB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWU6IHdoZW4gdGhlXG4gIC8vIEVGRkVDVElWRSBXQl9FTlYgZW5kcyB1cCBlbXB0eSDigJQgd2hldGhlciBpdCB3YXMgbmV2ZXIgZGVmaW5lZCwgZGVmaW5lZCBlbXB0eSwgb3IgZW1wdGllZCBieVxuICAvLyB0aGUgZXhwYW5zaW9uIGl0c2VsZiAoZS5nLiBgV0JfRU5WPSR7TUlTU0lOR19NT0RFfWApIOKAlCB3YidzIFByb2plY3QuZW52IGxhdGVyIGZpbGxzIGl0IHdpdGhcbiAgLy8gdGhlIGZhbGxiYWNrIG1vZGUsIHNvIHJlLWV4cGFuZCBmcm9tIHRoZSBvcmlnaW5hbCB2YWx1ZXMgd2l0aCB0aGF0IGZhbGxiYWNrIGF2YWlsYWJsZS5cbiAgLy8gT3B0LWluIHZpYSB0aGUgb3B0aW9uOiBhIGRpcmVjdCByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMvcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgLy8gY2FsbGVyIG5ldmVyIHJlY2VpdmVzIHRoZSBjb21wbGV0ZWQgV0JfRU5WLCBhbmQgZXhwYW5kaW5nIHJlZmVyZW5jZXMgYWdhaW5zdCBhIHZhbHVlIHRoYXQgaXNcbiAgLy8gbm90IGFjdHVhbGx5IGFwcGxpZWQgd291bGQgbWFrZSB0aGUgcGFpciBpbmNvbnNpc3RlbnQuXG4gIC8vIFRoZSBsb2FkZWQga2V5IG1hc2tzIHRoZSBhbWJpZW50IHZhbHVlLCBzbyBhIGxvYWRlZC1idXQtZW1wdGllZCBXQl9FTlYgbmVlZHMgdGhlIHJldHJ5IGV2ZW5cbiAgLy8gd2hlbiBhbiBleHBvcnRlZCBXQl9FTlYgZXhpc3RzIChhIGZvcmNlZCBtb2RlIGZpbGUgb3ZlcnJpZGVzIHRoZSBleHBvcnQgbG9jYWxseSk6IHJldHJ5IHdpdGhcbiAgLy8gdGhlIHZhbHVlIHRoZSBtZXJnZWQgZW52aXJvbm1lbnQgd2lsbCB1bHRpbWF0ZWx5IHJldGFpbi5cbiAgY29uc3QgZWZmZWN0aXZlV2JFbnYgPSBleHBhbmRlZEVudlZhcnMuV0JfRU5WID8/IHJ1bnRpbWVFbnYuV0JfRU5WO1xuICBpZiAob3B0aW9ucz8uZXhwYW5kRmFsbGJhY2tXYkVudiAmJiAhZWZmZWN0aXZlV2JFbnYpIHtcbiAgICBjb25zdCByZUV4cGFuc2lvbklucHV0ID0geyAuLi5wcmVFeHBhbnNpb25FbnZWYXJzIH07XG4gICAgZGVsZXRlIHJlRXhwYW5zaW9uSW5wdXQuV0JfRU5WO1xuICAgIGNvbnN0IHJldHJ5UmVmZXJlbmNlRW52ID0geyAuLi5wcmlzdGluZVJlZmVyZW5jZUVudiwgV0JfRU5WOiBydW50aW1lRW52LldCX0VOViB8fCByZXNvbHZlRmFsbGJhY2tXYkVudihhcmd2KSB9O1xuICAgIGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogcmVFeHBhbnNpb25JbnB1dCwgcHJvY2Vzc0VudjogcmV0cnlSZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IHJlRXhwYW5zaW9uSW5wdXQ7XG4gIH1cbiAgcmV0dXJuIFtleHBhbmRlZEVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIGZub3ggY29uZmlndXJhdGlvbiAoYGZub3gudG9tbGApLlxuICogVGhlIGJhc2UgYFtzZWNyZXRzXWAgdGFibGUgY2FycmllcyB0aGUgZGV2ZWxvcG1lbnQgdmFsdWVzLCBhbmQgYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gXG4gKiBvdmVybGF5cyBpdDsgYW4gdW5rbm93biBwcm9maWxlIGZhbGxzIGJhY2sgdG8gdGhlIGJhc2Ugc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiB7XG4gICAgaWdub3JlUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKiogUHJlY29tcHV0ZWQgaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSByZXN1bHQsIHRvIGF2b2lkIHJlLXdhbGtpbmcgdGhlIGFuY2VzdG9yIGRpcmVjdG9yaWVzLiAqL1xuICAgIGhhc0Zub3hDb25maWc/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCEob3B0aW9ucz8uaGFzRm5veENvbmZpZyA/PyBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IHNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgY2FzY2FkZSwgeyBxdWlldDogZmFsc2UgfSk7XG4gIGlmICghc2VjcmV0cykgcmV0dXJuIFt7fSwgW11dO1xuICAvLyBgW3Byb2ZpbGVzLjxjYXNjYWRlPi5zZWNyZXRzXWAgaXMgdGhlIGZub3ggYW5hbG9ndWUgb2YgYC5lbnYuPGNhc2NhZGU+YDogd2hlbiB0aGUgY2FsbGVyXG4gIC8vIGZvcmNlcyBhIG1vZGUgb2ZmIENJLCBwcm9maWxlLXNwZWNpZmljIHZhbHVlcyBtdXN0IG92ZXJyaWRlIGluaGVyaXRlZCBzaGVsbCB2YXJpYWJsZXMganVzdFxuICAvLyBsaWtlIGAuZW52Ljxtb2RlPmAgdmFsdWVzIGRvLCB3aGlsZSBiYXNlIGBbc2VjcmV0c11gIHZhbHVlcyBrZWVwIGxvc2luZyB0byBwcm9jZXNzLmVudi4gQSBrZXlcbiAgLy8gaXMgcHJvZmlsZS1zcGVjaWZpYyB3aGVuIHRoZSBwcm9maWxlIGV4cG9ydCdzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSBleHBvcnQnczsgd2hlbiB0aGVcbiAgLy8gYmFzZSBleHBvcnQgZmFpbHMsIG5vIG92ZXJyaWRlIGlzIGFwcGxpZWQgKGNvbnNlcnZhdGl2ZSkuIFRoZSBiYXNlIGV4cG9ydCBydW5zIExBWklMWSwgb25seVxuICAvLyB3aGVuIGEgcHJvY2Vzcy5lbnYgY29sbGlzaW9uIGFjdHVhbGx5IG5lZWRzIGFkanVkaWNhdGluZyDigJQgaXQgd291bGQgb3RoZXJ3aXNlIGFkZCBhXG4gIC8vIHN1YnByb2Nlc3MgKGluY2x1ZGluZyBhZ2UgZGVjcnlwdGlvbikgdG8gZXZlcnkgZm9yY2VkLW1vZGUgaW52b2NhdGlvbiBmb3Igbm90aGluZy5cbiAgbGV0IGNhY2hlZEJhc2VTZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB8IGZhbHNlID0gZmFsc2U7XG4gIGNvbnN0IGdldEJhc2VTZWNyZXRzID0gKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoY2FjaGVkQmFzZVNlY3JldHMgPT09IGZhbHNlKSB7XG4gICAgICBjYWNoZWRCYXNlU2VjcmV0cyA9IHJ1bkZub3hFeHBvcnQoY3dkLCB1bmRlZmluZWQsIHsgcXVpZXQ6IHRydWUsIGlnbm9yZVByb2ZpbGVFbnZWYXI6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRCYXNlU2VjcmV0cztcbiAgfTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbiBvdmVyIGZub3ggYmFzZSB2YWx1ZXMuXG4gICAgLy8gKFRoZSBtaXNlIHJlYWRlciBiZWxvdyBpbnRlbnRpb25hbGx5IHVzZXMgYSB2YWx1ZS1lcXVhbGl0eSBjaGVjayBpbnN0ZWFkOiBgbWlzZSBlbnZgIGVjaG9lc1xuICAgIC8vIGJhY2sgdmFyaWFibGVzIHRoZSBhbWJpZW50IG1pc2UgYWN0aXZhdGlvbiBhbHJlYWR5IGV4cG9ydGVkLCBhbmQgYSBkaWZmZXJpbmcgdmFsdWUgbWVhbnMgdGhlXG4gICAgLy8gcmVxdWVzdGVkIGNhc2NhZGUgcHJvZmlsZSBzaG91bGQgd2luIG92ZXIgdGhlIHN0YWxlIGFjdGl2YXRpb24uKVxuICAgIGlmICghb3B0aW9ucz8uaWdub3JlUHJvY2Vzc0VudiAmJiBrZXkgaW4gcHJvY2Vzcy5lbnYpIHtcbiAgICAgIGNvbnN0IGJhc2VTZWNyZXRzID0gb3B0aW9ucz8ubW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ICYmIGNhc2NhZGUgPyBnZXRCYXNlU2VjcmV0cygpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgb3ZlcnJpZGVzUHJvY2Vzc0VudiA9IGJhc2VTZWNyZXRzICE9PSB1bmRlZmluZWQgJiYgYmFzZVNlY3JldHNba2V5XSAhPT0gdmFsdWU7XG4gICAgICBpZiAoIW92ZXJyaWRlc1Byb2Nlc3NFbnYpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBydW5Gbm94RXhwb3J0KFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiB7IHF1aWV0OiBib29sZWFuOyBpZ25vcmVQcm9maWxlRW52VmFyPzogYm9vbGVhbiB9XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgIChkZWZhdWx0KTogZm5veCBvdGhlcndpc2UgZXhpdHMgMCBhbmQgc2lsZW50bHkgb21pdHMgc2VjcmV0cyBpdCBmYWlscyB0b1xuICAvLyByZXNvbHZlIChlLmcuIGEgbWlzc2luZyBhZ2Uga2V5KSwgd2hpY2ggd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIHNlY3JldHMuXG4gIC8vIE9wdC1pbiBlc2NhcGUgaGF0Y2ggYFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUz0xYDogc3dpdGNoIHRvIGB3YXJuYCBzbyBhIGtleWxlc3MgY29udGV4dCDigJQgZS5nLiBhXG4gIC8vIERvY2tlci9SYWlsd2F5IGltYWdlIGJ1aWxkIHRoYXQgb25seSBpbmxpbmVzIG5vbi1zZWNyZXQgcHVibGljIHZhbHVlcyAoYEFQUF9USVRMRWAsXG4gIC8vIGBORVhUX1BVQkxJQ18qYCkgd2hpbGUgdGhlIGFnZSBrZXkgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCDigJQgc3RpbGwgbG9hZHMgdGhlIHJlc29sdmFibGUgdmFsdWVzXG4gIC8vIChwbGFpbnRleHQgZGVmYXVsdHMgcGx1cyBhbnkgc2VjcmV0IHRoYXQgRElEIGRlY3J5cHQpIGluc3RlYWQgb2YgZmFpbGluZyBvdXRyaWdodC4gYHdhcm5gLCBub3RcbiAgLy8gYGlnbm9yZWAsIGtlZXBzIGZub3ggcmVwb3J0aW5nIHRoZSBza2lwcGVkIHNlY3JldCBuYW1lcyBvbiBzdGRlcnIgKHN1cmZhY2VkIGJlbG93KSwgc28gcmVsYXhpbmdcbiAgLy8gdGhlIGNoZWNrIHN0YXlzIGF1ZGl0YWJsZSByYXRoZXIgdGhhbiBzaWxlbnRseSBkcm9wcGluZyBkZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBgLS1ub24taW50ZXJhY3RpdmVgOiBwcm9tcHRzIG9yIGJyb3dzZXIgYXV0aCBmbG93cyB3b3VsZCBoYW5nIGZvcmV2ZXIgYmVjYXVzZSBzdGRpbiBpcyBpZ25vcmVkLlxuICBjb25zdCBhbGxvd01pc3NpbmdTZWNyZXRzID1cbiAgICBwcm9jZXNzLmVudi5XQl9BTExPV19NSVNTSU5HX1NFQ1JFVFMgPT09ICcxJyB8fCBwcm9jZXNzLmVudi5XQl9BTExPV19NSVNTSU5HX1NFQ1JFVFMgPT09ICd0cnVlJztcbiAgY29uc3QgYXJncyA9IFtcbiAgICAnZXhwb3J0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1uby1jb2xvcicsXG4gICAgJy0taWYtbWlzc2luZycsXG4gICAgYWxsb3dNaXNzaW5nU2VjcmV0cyA/ICd3YXJuJyA6ICdlcnJvcicsXG4gICAgJy0tbm9uLWludGVyYWN0aXZlJyxcbiAgXTtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1wcm9maWxlJywgY2FzY2FkZSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaWdub3JlUHJvZmlsZUVudlZhcikge1xuICAgIC8vIFdpdGhvdXQgYC0tcHJvZmlsZWAsIGZub3ggZmFsbHMgYmFjayB0byBGTk9YX1BST0ZJTEU7IHRoZSBiYXNlLWFkanVkaWNhdGlvbiBleHBvcnQgbXVzdFxuICAgIC8vIHJlYWQgdGhlIEJBU0Ugc2VjcmV0cywgc28gdGhlIGluaGVyaXRlZCBwcm9maWxlIHNlbGVjdGlvbiBpcyBjbGVhcmVkIGZvciBpdCDigJQgYW5kIG9ubHkgZm9yXG4gICAgLy8gaXQuIEEgUFJJTUFSWSBleHBvcnQgc3RpbGwgaG9ub3JzIEZOT1hfUFJPRklMRTogaXQgZWl0aGVyIHN0YXlzIHByb2ZpbGUtbGVzcyAoZm5veCByZWFkcyB0aGVcbiAgICAvLyB2YXJpYWJsZSkgb3IgZm9sZHMgaXQgaW50byB0aGUgYC0tcHJvZmlsZWAgaXQgcGFzc2VzIChzZWUgd2IgZG90ZW52J3MgY2FzY2FkZSkuXG4gICAgZGVsZXRlIGVudi5GTk9YX1BST0ZJTEU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnZm5veCcsIGFyZ3MsIHtcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHtcbiAgICAvLyBUaGUgcmVwb3NpdG9yeSBkZWNsYXJlcyBmbm94LW1hbmFnZWQgc2VjcmV0cyAoZm5veC50b21sIGV4aXN0cyksIHNvIGEgZmFpbGluZyBleHBvcnQgbXVzdCBiZVxuICAgIC8vIHN1cmZhY2VkOiBzd2FsbG93aW5nIGl0IHdvdWxkIG1ha2UgZGVjbGFyZWQgc2VjcmV0cyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHVuZGVjbGFyZWQgb25lcy5cbiAgICBpZiAoIW9wdGlvbnMucXVpZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGZub3ggc2VjcmV0czogJHtyZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzdWx0LnN0ZGVycj8udHJpbSgpIHx8IGBmbm94IGV4aXRlZCB3aXRoIHN0YXR1cyAke3Jlc3VsdC5zdGF0dXN9YH1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYWxsb3dNaXNzaW5nU2VjcmV0cyAmJiAhb3B0aW9ucy5xdWlldCAmJiByZXN1bHQuc3RkZXJyPy50cmltKCkpIHtcbiAgICAvLyBXaXRoIGAtLWlmLW1pc3Npbmcgd2FybmAsIGZub3ggZXhpdHMgMCBidXQgcmVwb3J0cyB0aGUgc2VjcmV0cyBpdCBjb3VsZCBub3QgcmVzb2x2ZSBvbiBzdGRlcnIuXG4gICAgLy8gU3VyZmFjZSB0aGVtIHNvIHJlbGF4aW5nIHRoZSBjaGVjayB2aWEgV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTIGRvZXMgbm90IGhpZGUgYSByZWFsIGdhcC5cbiAgICBjb25zb2xlLndhcm4oYFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUzogY29udGludWluZyB3aXRob3V0IHVucmVzb2x2ZWQgZm5veCBzZWNyZXRzLlxcbiR7cmVzdWx0LnN0ZGVyci50cmltKCl9YCk7XG4gIH1cblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzZWNyZXRzID0gKHBhcnNlZCBhcyB7IHNlY3JldHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5zZWNyZXRzO1xuICBpZiAoIXNlY3JldHMgfHwgdHlwZW9mIHNlY3JldHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2VjcmV0cykpIHJldHVybjtcbiAgcmV0dXJuIHNlY3JldHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZCwgWydmbm94LnRvbWwnXSk7XG59XG5cbmZ1bmN0aW9uIGZub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhc2NhZGUgPyBgZm5veCBleHBvcnQgLS1wcm9maWxlICR7Y2FzY2FkZX1gIDogJ2Zub3ggZXhwb3J0Jztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3VycmVudEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9wdGlvbnM/OiB7IGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzdHJpbmdbXV0ge1xuICBpZiAoIWhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBhcmdzID0gWydlbnYnLCAnLS1qc29uJywgJy0tY2QnLCBjd2RdO1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1lbnYnLCBjYXNjYWRlKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgYXJncywge1xuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHJldHVybiBbe30sIFtdXTtcblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbe30sIFtdXTtcbiAgfVxuICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBrZXkgaW4gY3VycmVudEVudlZhcnMpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52KSB7XG4gICAgICAvLyBgbWlzZSBlbnZgIGFsd2F5cyBlbWl0cyBQQVRIIGR1ZSB0byB0b29sIHNoaW1zOyBjb25zdW1lcnMgb2YgZmlsZS1kZWZpbmVkIHZhcmlhYmxlc1xuICAgICAgLy8gKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApIG11c3Qgbm90IHByb3BhZ2F0ZSBpdC5cbiAgICAgIGlmIChrZXkgPT09ICdQQVRIJykgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBbZW52VmFycywga2V5c107XG59XG5cbmZ1bmN0aW9uIGhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNBbmNlc3RvckNvbnRhaW5pbmcoY3dkLCBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pO1xufVxuXG5mdW5jdGlvbiBoYXNBbmNlc3RvckNvbnRhaW5pbmcoY3dkOiBzdHJpbmcsIGZpbGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBpZiAoZmlsZU5hbWVzLnNvbWUoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgZmlsZU5hbWUpKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZnVuY3Rpb24gaXNDSUVudmlyb25tZW50KGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGZub3gvbWlzZSBhbmQgYXNzaWducyB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIC8vIEV4aXN0aW5nIHByb2Nlc3MuZW52IGtleXMgYXJlIGtlcHQ6IGVudlZhcnMgbWF5IGRlbGliZXJhdGVseSBjb250YWluIGRpZmZlcmluZyB2YWx1ZXMgdGhhdFxuICAgIC8vIG11c3Qgd2luIG9ubHkgaW4gdGhlIHJldHVybmVkIHJlY29yZCAobWlzZSBjYXNjYWRlLXByb2ZpbGUgdmFsdWVzLCBmb3JjZWQtbW9kZSBvdmVycmlkZXNcbiAgICAvLyBjb25zdW1lZCB2aWEgYHByb2plY3QuZW52YCksIG5ldmVyIGNsb2JiZXIgdGhlIGNhbGxlcidzIG93biBwcm9jZXNzIGVudmlyb25tZW50LlxuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBibGFuay1vbmx5IGxpbmVzIGFyZSBza2lwcGVkIHdoaWxlIHByaW50aW5nIHN0ZG91dC9zdGRlcnIgaW4gcmVhbHRpbWUgKi9cbiAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGNvbnN0IHN0ZG91dFByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRvdXQsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBjb25zdCBzdGRlcnJQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3RkZXJyLCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgc3Rkb3V0UHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgc3RkZXJyUHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBzdGRvdXRQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIHN0ZGVyclByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFsdGltZVByaW50ZXIoXG4gIHN0cmVhbTogTm9kZUpTLldyaXRlU3RyZWFtLFxuICBvbWl0QmxhbmtMaW5lcyA9IGZhbHNlXG4pOiB7IHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkOyBmbHVzaDogKCkgPT4gdm9pZCB9IHtcbiAgaWYgKCFvbWl0QmxhbmtMaW5lcykge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogKGRhdGEpID0+IHN0cmVhbS53cml0ZShkYXRhKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB7fSxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBlbmRpbmcgPSAnJztcbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmcgKz0gZGF0YTtcbiAgICAgIGNvbnN0IGxpbmVzID0gcGVuZGluZy5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpID8/ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghaXNCbGFua0xpbmUobGluZSkpIHtcbiAgICAgICAgICBzdHJlYW0ud3JpdGUoYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmICghaXNCbGFua0xpbmUocGVuZGluZykpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcGVuZGluZyA9ICcnO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmxhbmtMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbiIsImNvbnN0IGJvb2xlYW5PcHRpb25OYW1lcyA9IG5ldyBTZXQoW1xuICAnYXV0by1jYXNjYWRlLWVudicsXG4gICdjYXNjYWRlLW5vZGUtZW52JyxcbiAgJ2RyeS1ydW4nLFxuICAnZHJ5JyxcbiAgJ2QnLFxuICAnaGVscCcsXG4gICdoJyxcbiAgJ3F1aWV0LWVudicsXG4gICd2ZXJib3NlJyxcbiAgJ3YnLFxuICAndmVyc2lvbicsXG5dKTtcbmNvbnN0IHZhbHVlT3B0aW9uTmFtZXMgPSBuZXcgU2V0KFsnY2FzY2FkZS1lbnYnLCAnd29ya2luZy1kaXInLCAndyddKTtcbmNvbnN0IGJvdW5kYXJ5TWFya2VyRW52TmFtZSA9ICdXQl9JTlRFUk5BTF9SVU5fQk9VTkRBUllfTUFSS0VSJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3RlY3RSdW5TY3JpcHRBcmdzKGFyZ3YpIHtcbiAgY29uc3QgcnVuSW5kZXggPSBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KTtcbiAgaWYgKHJ1bkluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNjcmlwdEluZGV4ID0gZmluZFJ1blNjcmlwdEluZGV4KGFyZ3YsIHJ1bkluZGV4ICsgMSk7XG4gIGlmIChzY3JpcHRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGFyZ3Zbc2NyaXB0SW5kZXggLSAxXSA9PT0gJy0tJykgcmV0dXJuO1xuXG4gIGNvbnN0IGV4aXN0aW5nTWFya2VyID0gcHJvY2Vzcy5lbnZbYm91bmRhcnlNYXJrZXJFbnZOYW1lXTtcbiAgaWYgKGFyZ3Zbc2NyaXB0SW5kZXggKyAxXSA9PT0gJy0tJykge1xuICAgIGlmIChleGlzdGluZ01hcmtlciAmJiBhcmd2W3NjcmlwdEluZGV4ICsgMl0gPT09IGV4aXN0aW5nTWFya2VyKSByZXR1cm47XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG1hcmtlcjtcbiAgZG8gbWFya2VyID0gYF9fV0JfUlVOX1NDUklQVF9BUkdTXyR7cmFuZG9tVVVJRCgpfV9fYDtcbiAgd2hpbGUgKGFyZ3YuaW5jbHVkZXMobWFya2VyKSk7XG4gIHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV0gPSBtYXJrZXI7XG4gIGFyZ3Yuc3BsaWNlKHNjcmlwdEluZGV4ICsgMSwgMCwgJy0tJywgbWFya2VyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1blNjcmlwdEFyZ3MoYXJndikge1xuICBjb25zdCBydW5JbmRleCA9IGZpbmRUb3BMZXZlbFJ1bkluZGV4KGFyZ3YpO1xuICBpZiAocnVuSW5kZXggPT09IC0xKSByZXR1cm4gW107XG4gIGNvbnN0IHNjcmlwdEluZGV4ID0gZmluZFJ1blNjcmlwdEluZGV4KGFyZ3YsIHJ1bkluZGV4ICsgMSk7XG4gIGlmIChzY3JpcHRJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG5cbiAgY29uc3QgYXJncyA9IGFyZ3Yuc2xpY2Uoc2NyaXB0SW5kZXgpO1xuICBjb25zdCBtYXJrZXIgPSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICBpZiAobWFya2VyICYmIGFyZ3NbMV0gPT09ICctLScgJiYgYXJnc1syXSA9PT0gbWFya2VyKSBhcmdzLnNwbGljZSgxLCAyKTtcbiAgZGVsZXRlIHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KSB7XG4gIGZvciAobGV0IGluZGV4ID0gMjsgaW5kZXggPCBhcmd2Lmxlbmd0aDsgKSB7XG4gICAgY29uc3QgY29uc3VtZWQgPSBjb3VudE9wdGlvblRva2Vucyhhcmd2LCBpbmRleCk7XG4gICAgaWYgKGNvbnN1bWVkID09PSAwKSByZXR1cm4gYXJndltpbmRleF0gPT09ICdydW4nID8gaW5kZXggOiAtMTtcbiAgICBpbmRleCArPSBjb25zdW1lZDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBzdGFydEluZGV4KSB7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBhcmd2Lmxlbmd0aDsgKSB7XG4gICAgaWYgKGFyZ3ZbaW5kZXhdID09PSAnLS0nKSByZXR1cm4gYXJndltpbmRleCArIDFdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBpbmRleCArIDE7XG4gICAgY29uc3QgY29uc3VtZWQgPSBjb3VudE9wdGlvblRva2Vucyhhcmd2LCBpbmRleCk7XG4gICAgaWYgKGNvbnN1bWVkID09PSAwKSByZXR1cm4gaW5kZXg7XG4gICAgaW5kZXggKz0gY29uc3VtZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpIHtcbiAgY29uc3QgYXJnID0gYXJndltpbmRleF07XG4gIGlmICghYXJnPy5zdGFydHNXaXRoKCctJykgfHwgYXJnID09PSAnLScpIHJldHVybiAwO1xuICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICBjb25zdCBvcHRpb25UZXh0ID0gYXJnLnNsaWNlKDIpO1xuICAgIGNvbnN0IGVxdWFsc0luZGV4ID0gb3B0aW9uVGV4dC5pbmRleE9mKCc9Jyk7XG4gICAgY29uc3QgcmF3TmFtZSA9IGVxdWFsc0luZGV4ID09PSAtMSA/IG9wdGlvblRleHQgOiBvcHRpb25UZXh0LnNsaWNlKDAsIGVxdWFsc0luZGV4KTtcbiAgICBjb25zdCBuYW1lID0gcmF3TmFtZS5zdGFydHNXaXRoKCduby0nKSA/IHJhd05hbWUuc2xpY2UoMykgOiByYXdOYW1lO1xuICAgIGlmIChib29sZWFuT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXF1YWxzSW5kZXggPT09IC0xICYmIGlzQm9vbGVhbkxpdGVyYWwoYXJndltpbmRleCArIDFdKSA/IDIgOiAxO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSByZXR1cm4gMDtcbiAgICByZXR1cm4gZXF1YWxzSW5kZXggPT09IC0xID8gMiA6IDE7XG4gIH1cblxuICBjb25zdCBzaG9ydE9wdGlvbnMgPSBhcmcuc2xpY2UoMSk7XG4gIGlmICgvXltkaHZdPShmYWxzZXx0cnVlKSQvLnRlc3Qoc2hvcnRPcHRpb25zKSkgcmV0dXJuIDE7XG4gIGlmICgvXltkaHZdJC8udGVzdChzaG9ydE9wdGlvbnMpICYmIGlzQm9vbGVhbkxpdGVyYWwoYXJndltpbmRleCArIDFdKSkgcmV0dXJuIDI7XG4gIGZvciAobGV0IG9wdGlvbkluZGV4ID0gMDsgb3B0aW9uSW5kZXggPCBzaG9ydE9wdGlvbnMubGVuZ3RoOyBvcHRpb25JbmRleCsrKSB7XG4gICAgY29uc3QgbmFtZSA9IHNob3J0T3B0aW9uc1tvcHRpb25JbmRleF07XG4gICAgaWYgKGJvb2xlYW5PcHRpb25OYW1lcy5oYXMobmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmICh2YWx1ZU9wdGlvbk5hbWVzLmhhcyhuYW1lKSkgcmV0dXJuIG9wdGlvbkluZGV4ICsgMSA8IHNob3J0T3B0aW9ucy5sZW5ndGggPyAxIDogMjtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuTGl0ZXJhbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJztcbn1cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4qIEEgU0hBMy01MTIgaW1wbGVtZW50YXRpb24gc3BlY2lhbGl6ZWQgYW5kIG9wdGltaXplZCBmcm9tXG4qIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9ICh2ZXJzaW9uIDAuOS4zKS5cbipcbiogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiogQGxpY2Vuc2UgTUlUXG4qL1xuY29uc3QgZT1BcnJheS5mcm9tKHtsZW5ndGg6MjU2fSwoZSx0KT0+dC50b1N0cmluZygxNikucGFkU3RhcnQoMixgMGApKSx0PW5ldyBJbnQzMkFycmF5KFsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XSksbj1uZXcgSW50MzJBcnJheSg1MCkscj1uZXcgSW50MzJBcnJheSgxOCksaT1uZXcgVGV4dEVuY29kZXI7bGV0IGE9bmV3IFVpbnQ4QXJyYXkoNDA5Niksbz1uZXcgVWludDMyQXJyYXkoYS5idWZmZXIpO2NvbnN0IGVlPW5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMV0pLmJ1ZmZlcilbMF09PT0xO2Z1bmN0aW9uIHModCl7bGV0IHM9dC5sZW5ndGgqMyxsPWEsdT1vO2lmKGwubGVuZ3RoPHMpe2xldCBlPWwubGVuZ3RoKjI7Zm9yKDtlPHM7KWUqPTI7bD1uZXcgVWludDhBcnJheShlKSx1PW5ldyBVaW50MzJBcnJheShsLmJ1ZmZlciksZTw9MTA0ODU3NiYmKGE9bCxvPXUpfWxldCBkPWkuZW5jb2RlSW50byh0LGwpLndyaXR0ZW4sZj1uO2YuZmlsbCgwKTtsZXQgcD0wO2lmKGVlKXtsZXQgZT0wO2Zvcig7ZC1wPj03Mjspe2ZvcihsZXQgdD0wO3Q8MTg7dCsrKWZbdF09Zlt0XV51W2UrdF07YyhmKSxlKz0xOCxwKz03Mn19ZWxzZSBmb3IoO2QtcD49NzI7KXtmb3IobGV0IGU9MDtlPDE4O2UrKyl7bGV0IHQ9cCsoZTw8Mik7ZltlXT1mW2VdXihsW3RdfGxbdCsxXTw8OHxsW3QrMl08PDE2fGxbdCszXTw8MjQpfWMoZikscCs9NzJ9bGV0IG09cjttLmZpbGwoMCk7Zm9yKGxldCBlPXA7ZTxkO2UrKyl7bGV0IHQ9ZS1wO21bdD4+Ml09bVt0Pj4yXXxsW2VdPDwoKHQmMyk8PDMpfWxldCBoPWQtcDttW2g+PjJdPW1baD4+Ml18Njw8KChoJjMpPDwzKSxtWzE3XXw9MjE0NzQ4MzY0ODtmb3IobGV0IGU9MDtlPDE4O2UrKylmW2VdPWZbZV1ebVtlXTtjKGYpO2xldCBnPWBgO2ZvcihsZXQgdD0wO3Q8MTY7dCs9NCl7bGV0IG49Zlt0XSxyPWZbdCsxXSxpPWZbdCsyXSxhPWZbdCszXTtnKz1lW24mMjU1XStlW24+PjgmMjU1XStlW24+PjE2JjI1NV0rZVtuPj4+MjRdK2VbciYyNTVdK2Vbcj4+OCYyNTVdK2Vbcj4+MTYmMjU1XStlW3I+Pj4yNF0rZVtpJjI1NV0rZVtpPj44JjI1NV0rZVtpPj4xNiYyNTVdK2VbaT4+PjI0XStlW2EmMjU1XStlW2E+PjgmMjU1XStlW2E+PjE2JjI1NV0rZVthPj4+MjRdfXJldHVybiBnfWZ1bmN0aW9uIGMoZSl7bGV0IG4scixpLGEsbyxlZSxzLGMsbCx1LGQsZixwLG0saCxnLHRlLG5lLHJlLGllLGFlLG9lLHNlLGNlLGxlLHVlLGRlLGZlLHBlLG1lLGhlLGdlLF9lLHZlLHllLGJlLHhlLFNlLENlLHdlLFRlLEVlLERlLE9lLGtlLEFlLGplLE1lLE5lLFBlLEZlLEllLExlLFJlLHplLEJlLFZlLEhlLFVlLFdlLEdlLEtlLHFlLF89ZVswXSx2PWVbMV0seT1lWzJdLEplPWVbM10sYj1lWzRdLHg9ZVs1XSxTPWVbNl0sQz1lWzddLHc9ZVs4XSxUPWVbOV0sRT1lWzEwXSxEPWVbMTFdLE89ZVsxMl0saz1lWzEzXSxBPWVbMTRdLGo9ZVsxNV0sTT1lWzE2XSxOPWVbMTddLFA9ZVsxOF0sRj1lWzE5XSxJPWVbMjBdLEw9ZVsyMV0sUj1lWzIyXSx6PWVbMjNdLEI9ZVsyNF0sVj1lWzI1XSxIPWVbMjZdLFU9ZVsyN10sVz1lWzI4XSxHPWVbMjldLEs9ZVszMF0scT1lWzMxXSxKPWVbMzJdLFk9ZVszM10sWD1lWzM0XSxaPWVbMzVdLFE9ZVszNl0sJD1lWzM3XSxZZT1lWzM4XSxYZT1lWzM5XSxaZT1lWzQwXSxRZT1lWzQxXSwkZT1lWzQyXSxldD1lWzQzXSx0dD1lWzQ0XSxudD1lWzQ1XSxydD1lWzQ2XSxpdD1lWzQ3XSxhdD1lWzQ4XSxvdD1lWzQ5XTtmb3IoaT0wO2k8NDg7aSs9MilhPV9eRV5JXkteWmUsbz12XkReTF5xXlFlLGVlPXleT15SXkpeJGUscz1KZV5rXnpeWV5ldCxjPWJeQV5CXlhedHQsbD14XmpeVl5aXm50LHU9U15NXkheUV5ydCxkPUNeTl5VXiReaXQsZj13XlBeV15ZZV5hdCxwPVReRl5HXlhlXm90LG49Zl4oZWU8PDF8cz4+PjMxKSxyPXBeKHM8PDF8ZWU+Pj4zMSksX149bix2Xj1yLEVePW4sRF49cixJXj1uLExePXIsS149bixxXj1yLFplXj1uLFFlXj1yLG49YV4oYzw8MXxsPj4+MzEpLHI9b14obDw8MXxjPj4+MzEpLHlePW4sSmVePXIsT149bixrXj1yLFJePW4sel49cixKXj1uLFlePXIsJGVePW4sZXRePXIsbj1lZV4odTw8MXxkPj4+MzEpLHI9c14oZDw8MXx1Pj4+MzEpLGJePW4seF49cixBXj1uLGpePXIsQl49bixWXj1yLFhePW4sWl49cix0dF49bixudF49cixuPWNeKGY8PDF8cD4+PjMxKSxyPWxeKHA8PDF8Zj4+PjMxKSxTXj1uLENePXIsTV49bixOXj1yLEhePW4sVV49cixRXj1uLCRePXIscnRePW4saXRePXIsbj11XihhPDwxfG8+Pj4zMSkscj1kXihvPDwxfGE+Pj4zMSksd149bixUXj1yLFBePW4sRl49cixXXj1uLEdePXIsWWVePW4sWGVePXIsYXRePW4sb3RePXIsbT1fLGg9dixBZT1EPDw0fEU+Pj4yOCxqZT1FPDw0fEQ+Pj4yOCxmZT1JPDwzfEw+Pj4yOSxwZT1MPDwzfEk+Pj4yOSxXZT1xPDw5fEs+Pj4yMyxHZT1LPDw5fHE+Pj4yMyxFZT1aZTw8MTh8UWU+Pj4xNCxEZT1RZTw8MTh8WmU+Pj4xNCx2ZT15PDwxfEplPj4+MzEseWU9SmU8PDF8eT4+PjMxLGc9azw8MTJ8Tz4+PjIwLHRlPU88PDEyfGs+Pj4yMCxNZT1SPDwxMHx6Pj4+MjIsTmU9ejw8MTB8Uj4+PjIyLG1lPVk8PDEzfEo+Pj4xOSxoZT1KPDwxM3xZPj4+MTksS2U9JGU8PDJ8ZXQ+Pj4zMCxxZT1ldDw8MnwkZT4+PjMwLFJlPXg8PDMwfGI+Pj4yLHplPWI8PDMwfHg+Pj4yLGJlPUE8PDZ8aj4+PjI2LHhlPWo8PDZ8QT4+PjI2LG5lPVY8PDExfEI+Pj4yMSxyZT1CPDwxMXxWPj4+MjEsUGU9WDw8MTV8Wj4+PjE3LEZlPVo8PDE1fFg+Pj4xNyxnZT1udDw8Mjl8dHQ+Pj4zLF9lPXR0PDwyOXxudD4+PjMsY2U9Uzw8Mjh8Qz4+PjQsbGU9Qzw8Mjh8Uz4+PjQsQmU9Tjw8MjN8TT4+PjksVmU9TTw8MjN8Tj4+PjksU2U9SDw8MjV8VT4+PjcsQ2U9VTw8MjV8SD4+PjcsaWU9UTw8MjF8JD4+PjExLGFlPSQ8PDIxfFE+Pj4xMSxJZT1pdDw8MjR8cnQ+Pj44LExlPXJ0PDwyNHxpdD4+PjgsT2U9dzw8Mjd8VD4+PjUsa2U9VDw8Mjd8dz4+PjUsdWU9UDw8MjB8Rj4+PjEyLGRlPUY8PDIwfFA+Pj4xMixIZT1HPDw3fFc+Pj4yNSxVZT1XPDw3fEc+Pj4yNSx3ZT1ZZTw8OHxYZT4+PjI0LFRlPVhlPDw4fFllPj4+MjQsb2U9YXQ8PDE0fG90Pj4+MTgsc2U9b3Q8PDE0fGF0Pj4+MTgsXz1tXn5nJm5lLHY9aF5+dGUmcmUsRT1jZV5+dWUmZmUsRD1sZV5+ZGUmcGUsST12ZV5+YmUmU2UsTD15ZV5+eGUmQ2UsSz1PZV5+QWUmTWUscT1rZV5+amUmTmUsWmU9UmVefkJlJkhlLFFlPXplXn5WZSZVZSx5PWdefm5lJmllLEplPXRlXn5yZSZhZSxPPXVlXn5mZSZtZSxrPWRlXn5wZSZoZSxSPWJlXn5TZSZ3ZSx6PXhlXn5DZSZUZSxKPUFlXn5NZSZQZSxZPWplXn5OZSZGZSwkZT1CZV5+SGUmV2UsZXQ9VmVeflVlJkdlLGI9bmVefmllJm9lLHg9cmVefmFlJnNlLEE9ZmVefm1lJmdlLGo9cGVefmhlJl9lLEI9U2VefndlJkVlLFY9Q2VeflRlJkRlLFg9TWVeflBlJkllLFo9TmVefkZlJkxlLHR0PUhlXn5XZSZLZSxudD1VZV5+R2UmcWUsUz1pZV5+b2UmbSxDPWFlXn5zZSZoLE09bWVefmdlJmNlLE49aGVefl9lJmxlLEg9d2VefkVlJnZlLFU9VGVefkRlJnllLFE9UGVefkllJk9lLCQ9RmVefkxlJmtlLHJ0PVdlXn5LZSZSZSxpdD1HZV5+cWUmemUsdz1vZV5+bSZnLFQ9c2VefmgmdGUsUD1nZV5+Y2UmdWUsRj1fZV5+bGUmZGUsVz1FZV5+dmUmYmUsRz1EZV5+eWUmeGUsWWU9SWVefk9lJkFlLFhlPUxlXn5rZSZqZSxhdD1LZV5+UmUmQmUsb3Q9cWVefnplJlZlLF9ePXRbaV0sdl49dFtpKzFdO2VbMF09XyxlWzFdPXYsZVsyXT15LGVbM109SmUsZVs0XT1iLGVbNV09eCxlWzZdPVMsZVs3XT1DLGVbOF09dyxlWzldPVQsZVsxMF09RSxlWzExXT1ELGVbMTJdPU8sZVsxM109ayxlWzE0XT1BLGVbMTVdPWosZVsxNl09TSxlWzE3XT1OLGVbMThdPVAsZVsxOV09RixlWzIwXT1JLGVbMjFdPUwsZVsyMl09UixlWzIzXT16LGVbMjRdPUIsZVsyNV09VixlWzI2XT1ILGVbMjddPVUsZVsyOF09VyxlWzI5XT1HLGVbMzBdPUssZVszMV09cSxlWzMyXT1KLGVbMzNdPVksZVszNF09WCxlWzM1XT1aLGVbMzZdPVEsZVszN109JCxlWzM4XT1ZZSxlWzM5XT1YZSxlWzQwXT1aZSxlWzQxXT1RZSxlWzQyXT0kZSxlWzQzXT1ldCxlWzQ0XT10dCxlWzQ1XT1udCxlWzQ2XT1ydCxlWzQ3XT1pdCxlWzQ4XT1hdCxlWzQ5XT1vdH1leHBvcnR7cyBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcCIsImNvbnN0IGU9cigpLHQ9bmV3IFRleHRFbmNvZGVyLG49bmV3IFRleHREZWNvZGVyKGB1dGYtOGApO2Z1bmN0aW9uIHIoKXtyZXR1cm4gbmV3IE1hcChbe2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2xldCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gZS5zdGFjayE9PXZvaWQgMCYmdC5wdXNoKGUuc3RhY2spLGUuY2F1c2UhPT12b2lkIDAmJihlLnN0YWNrPT09dm9pZCAwJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9PkVycm9yKCksaHlkcmF0ZTooZSxbdCxuLHIsaV0pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4scj09PXZvaWQgMD9kZWxldGUgZS5zdGFjazplLnN0YWNrPXIsaSE9PXZvaWQgMCYmKGUuY2F1c2U9aSl9fSx7aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKG4uZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT50LmVuY29kZShhdG9iKGUpKX0se2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGxldFtuLHJdb2YgdCllLnNldChuLHIpfX0se2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IobGV0IG4gb2YgdCllLmFkZChuKX19LHtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LHtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0se2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX1dLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9ZXhwb3J0e2UgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgZX1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2Z1bmN0aW9uIHQodCxuPWUpe3JldHVybiBKU09OLnN0cmluZ2lmeShyKHQsbikpfWZ1bmN0aW9uIG4oZSl7aWYoZT09PXZvaWQgMClyZXR1cm4tMTtpZih0eXBlb2YgZT09YG51bWJlcmApe2lmKE51bWJlci5pc05hTihlKSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKGUpKXJldHVybiBlPDA/LTU6LTR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcih0LHI9ZSl7bGV0IGk9bih0KTtpZihpIT09bnVsbClyZXR1cm4gaTtsZXQgYT1bXSxvPW5ldyBNYXA7cmV0dXJuIHModCksYTtmdW5jdGlvbiBzKGUpe2xldCB0PW4oZSk7aWYodCE9PW51bGwpcmV0dXJuIHQ7bGV0IGk9by5nZXQoZSk7aWYoaSE9PXZvaWQgMClyZXR1cm4gaTtzd2l0Y2goaT1hLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZWBudW1iZXJgOmNhc2Vgc3RyaW5nYDpjYXNlYGJvb2xlYW5gOmFbaV09ZSxvLnNldChlLGkpO2JyZWFrO2Nhc2VgYmlnaW50YDphW2ldPVstNixlLnRvU3RyaW5nKDE2KV0sby5zZXQoZSxpKTticmVhaztjYXNlYG9iamVjdGA6aWYoZT09PW51bGwpYVtpXT1lLG8uc2V0KGUsaSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtsZXQgdD1lLmxlbmd0aCxuPUFycmF5KHQpO2FbaV09bixvLnNldChlLGkpO2ZvcihsZXQgcj0wO3I8dDtyKyspbltyXT1zKGVbcl0pfWVsc2V7bGV0IHQ9ZS5jb25zdHJ1Y3RvcixuPXR5cGVvZiB0PT1gZnVuY3Rpb25gP3IuZ2V0KHQubmFtZSk6dm9pZCAwO2lmKG49PT12b2lkIDApe2xldCB0PU9iamVjdC5rZXlzKGUpLG49dC5sZW5ndGgscj1BcnJheShuK24rMSk7clswXT1gYCxhW2ldPXIsby5zZXQoZSxpKTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj10W2ldLGE9aStpO3JbYSsxXT1zKG4pLHJbYSsyXT1zKGVbbl0pfX1lbHNle2xldCByPW4uZnJvbShlKSxjPXIubGVuZ3RoLGw9QXJyYXkoYysxKTtsWzBdPXQubmFtZSxhW2ldPWwsby5zZXQoZSxpKTtmb3IobGV0IGU9MDtlPGM7ZSsrKWxbZSsxXT1zKHJbZV0pfX19cmV0dXJuIGl9fWV4cG9ydHt0IGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwIiwiaW1wb3J0e3NoYTNfNTEyIGFzIGV9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyB0fWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBuKG4scil7cmV0dXJuIGUodChbbixyXSkpfWZ1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdChbZSxuXSl9ZnVuY3Rpb24gaSgpe3JldHVybmBgfWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxuIGFzIGdldENhY2hlS2V5T2ZIYXNoLHIgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcCIsImltcG9ydHtnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZSxnZXRDYWNoZUtleU9mSGFzaCBhcyB0fWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPWkoe2dldENhY2hlS2V5OnR9KSxyPWkoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiBpKHtjYWNoZUR1cmF0aW9uOmU9MS8wLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LHIpe2xldCBpLGEsbztyZXR1cm4gcj8ua2luZD09PWBnZXR0ZXJgP2Z1bmN0aW9uKCl7bGV0IHI9bih0aGlzLFtdKSxzPURhdGUubm93KCk7cmV0dXJuKG8hPT1yfHxzLWE+ZSkmJihvPXIsaT10LmNhbGwodGhpcyksYT1zKSxpfTpmdW5jdGlvbiguLi5zKXtsZXQgYz1uKHRoaXMscyksbD1EYXRlLm5vdygpO3JldHVybihvIT09Y3x8bC1hPmUpJiYobz1jLGk9UmVmbGVjdC5hcHBseSh0LHI/dGhpczp2b2lkIDAscyksYT1sKSxpfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxpIGFzIG1lbW9pemVPbmVGYWN0b3J5LHIgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXAiLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFByZXBlbmQgZXZlcnkgZXhpc3RpbmcgYG5vZGVfbW9kdWxlcy8uYmluYCBkaXJlY3RvcnkgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IHVwIHRvIHRoZVxuICogcmVwb3NpdG9yeSByb290IChvciBmaWxlc3lzdGVtIHJvb3QpIHRvIHRoZSBlbnZpcm9ubWVudCdzIFBBVEgsIG5lYXJlc3QgZGlyZWN0b3J5IGZpcnN0IHNvXG4gKiBhIHdvcmtzcGFjZS1sb2NhbCBkZXBlbmRlbmN5IHdpbnMgb3ZlciBhIHJlcG9zaXRvcnktcm9vdCBvbmUuIE5lZWRlZCB3aGVyZXZlciB3YiBzdHJpcHNcbiAqIHlhcm4ncyB0ZW1wb3JhcnkgYmluIGZvbGRlciBmcm9tIFBBVEggKHlhcm4gQmVycnkgZXhwb3NlcyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzIG9ubHlcbiAqIHRocm91Z2ggdGhhdCBmb2xkZXIsIG5ldmVyIHRocm91Z2ggYG5vZGVfbW9kdWxlcy8uYmluYCBvbiBQQVRIKSwgc28gdGhhdCBiYXJlIGJpbmFyeSBuYW1lc1xuICogaW4gd3JhcHBlZCBjb21tYW5kcyBrZWVwIHJlc29sdmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChkaXJQYXRoOiBzdHJpbmcsIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IGJvb2xlYW4ge1xuICBjb25zdCBiaW5QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgIGJpblBhdGhzLnB1c2goYmluUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICBpZiAoYmluUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGVudi5QQVRIID0gZW52LlBBVEggPyBgJHtiaW5QYXRocy5qb2luKCc6Jyl9OiR7ZW52LlBBVEh9YCA6IGJpblBhdGhzLmpvaW4oJzonKTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUcnV0aHlFbnZWYWx1ZShjaUVudik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHJ1dGh5RW52VmFsdWUocHJvamVjdC5lbnYuV0JfRE9DS0VSKTtcbn1cblxuZnVuY3Rpb24gaXNUcnV0aHlFbnZWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXZhbHVlICYmIHZhbHVlICE9PSAnMCcgJiYgdmFsdWUgIT09ICdmYWxzZSc7XG59XG4iLCIvKipcbiAqIFRoZSBrZXlzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBwcm9qZWN0J3MgZm5veCBzb3VyY2VzLiBgbWlzZSBlbnZgIGlzIHJlcG9ydGVkIGFzIGFcbiAqIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIChQQVRILCBDQVJHT19IT01FLCBSVVNUVVBfKiwgLi4uKTsgdGhvc2UgbXVzdFxuICogbmV2ZXIgYmUgdHJlYXRlZCBhcyB0aGUgcHJvamVjdCdzIG93biB2YXJpYWJsZXMsIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RGbm94U291cmNlZEtleXMoZW52U291cmNlczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCByZWFkb25seSBzdHJpbmdbXV0+KTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VzQnVuUnVudGltZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTWlycm9ycyBQcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcjogdGhlIG91dGVybW9zdCBwYWNrYWdlTWFuYWdlciBkZWNsYXJhdGlvbiAodGhlXG4gIC8vIHdvcmtzcGFjZSByb290J3MpIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBuZXN0ZWQgb25lcywgYW5kIGFuIGV4cGxpY2l0IG5vbi1CdW4gZGVjbGFyYXRpb25cbiAgLy8gd2lucyBvdmVyIHRoZSBkaXJlY3RvcnkgbWFya2Vycy4gVGhlIHdhbGsgdGhlcmVmb3JlIGNvbGxlY3RzIHNpZ25hbHMgdXAgdG8gdGhlIHJlcG9zaXRvcnlcbiAgLy8gcm9vdCBpbnN0ZWFkIG9mIGRlY2lkaW5nIGF0IHRoZSBmaXJzdCBoaXQsIHNvIGEgY2hpbGQgd29ya3NwYWNlIGNhbm5vdCBvdmVycmlkZSB0aGUgcm9vdC5cbiAgbGV0IG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyOiB1bmtub3duO1xuICBsZXQgaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciA9IGZhbHNlO1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJlYWRQYWNrYWdlTWFuYWdlckZpZWxkKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgICBpZiAocGFja2FnZU1hbmFnZXIgIT09IHVuZGVmaW5lZCkgb3V0ZXJtb3N0UGFja2FnZU1hbmFnZXIgPSBwYWNrYWdlTWFuYWdlcjtcbiAgICBoYXNTb21lQnVuRGlyZWN0b3J5TWFya2VyIHx8PSBoYXNCdW5EaXJlY3RvcnlNYXJrZXIoY3VycmVudFBhdGgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkgfHwgcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSA9PT0gY3VycmVudFBhdGgpIHtcbiAgICAgIGlmIChpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIob3V0ZXJtb3N0UGFja2FnZU1hbmFnZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciB8fCBpc0J1blBhY2thZ2VNYW5hZ2VyKG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkaXJlY3RvcnkgY2FycmllcyBhIGJ1biBtYXJrZXI6IGEgYnVuIGxvY2tmaWxlLCBhIG1pc2UtcGlubmVkIGJ1biwgb3IgYVxuICogYC50b29sLXZlcnNpb25zYCBidW4gZW50cnkuIHdiZnkgbWlncmF0ZXMgLnRvb2wtdmVyc2lvbnMgaW50byBtaXNlLnRvbWwsIHNvIGEgbWlzZS1waW5uZWQgYnVuXG4gKiBtdXN0IGNvdW50IGFzIHdlbGw6IHJlcG9zIHRoYXQgZ2l0aWdub3JlIGJ1bi5sb2NrIGFuZCBoYXZlIG5vIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIHJlbHkgb24gdGhlXG4gKiB0b29sIG1hbmlmZXN0LiBUaGlzIGlzIHRoZSBzaW5nbGUgc2lnbmFsIGxpc3QgZGVjaWRpbmcgYnVuLXZzLXlhcm47IGBQcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcmBcbiAqIGFuZCBgdXNlc0J1blJ1bnRpbWVgIHNoYXJlIGl0IOKAlCBhbmQgYm90aCBnaXZlIGFuIGV4cGxpY2l0IG5vbi1CdW4gcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb25cbiAqIHByZWNlZGVuY2Ugb3ZlciBpdCAoc2VlIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcikg4oCUIHNvIHRoZSB0d28gZGV0ZWN0aW9ucyBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNCdW5EaXJlY3RvcnlNYXJrZXIoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSkgfHxcbiAgICBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgICB0ZXN0RmlsZUNvbnRlbnQocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgL15cXHMqKD86XCJidW5cInxidW4pXFxzKj0vbSlcbiAgICApIHx8XG4gICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbihkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgLyhefFxcbilidW5cXHMvKVxuICApO1xufVxuXG4vKipcbiAqIEFuIGV4cGxpY2l0IG5vbi1CdW4gcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb24gKGUuZy4gYHlhcm5ANC4xNy4wYCkgb3ZlcnJpZGVzIHRoZSBkaXJlY3RvcnlcbiAqIG1hcmtlcnM6IHlhcm4tZXJhIHJlcG9zaXRvcmllcyBtYXkgcGluIGJ1biBpbiBtaXNlLnRvbWwgc29sZWx5IGZvciBgYnVueGAtYmFzZWQgaGVscGVyc1xuICogKGUuZy4gYHdiIHJhaWx3YXktZW52YCksIGFuZCBCdW4tbWFuYWdlZCByZXBvc2l0b3JpZXMgbmV2ZXIgZGVjbGFyZSBhIG5vbi1CdW4gcGFja2FnZU1hbmFnZXJcbiAqICh3YmZ5IGRlbGV0ZXMgdGhlIGZpZWxkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiAhIXBhY2thZ2VNYW5hZ2VyLnRyaW0oKSAmJiAhaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J1blBhY2thZ2VNYW5hZ2VyKHBhY2thZ2VNYW5hZ2VyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VNYW5hZ2VyRmllbGQocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBwYWNrYWdlTWFuYWdlcj86IHVua25vd24gfSkucGFja2FnZU1hbmFnZXI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgQUxMT1dFRF9URVNUX0RJUkVDVE9SWV9OQU1FUyA9IG5ldyBTZXQoWyd1bml0JywgJ2UyZScsICdkZWJ1ZycsICdoZWxwZXJzJywgJ2ZpeHR1cmVzJ10pO1xuY29uc3QgUlVOTkFCTEVfVEVTVF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsndW5pdCcsICdlMmUnLCAnZGVidWcnXSk7XG5jb25zdCBURVNUX0ZJTEVfTkFNRV9SRUdFWFAgPSAvXFwuKD86dGVzdHxzcGVjKVxcLltjbV0/W2p0XXN4PyQvO1xuXG4vKipcbiAqIEVuZm9yY2VzIHRoZSB0ZXN0LWxheW91dCBjb252ZW50aW9uIHdpdGggbm8gZmFsbGJhY2s6IGB0ZXN0L2AgbWF5IGNvbnRhaW4gb25seSB0aGUgYHVuaXRgLCBgZTJlYCxcbiAqIGBkZWJ1Z2AsIGBoZWxwZXJzYCwgYW5kIGBmaXh0dXJlc2AgZGlyZWN0b3JpZXMsIGFuZCB0ZXN0IGZpbGVzIG1heSBleGlzdCBvbmx5IHVuZGVyIGB0ZXN0L3VuaXQvYCxcbiAqIGB0ZXN0L2UyZS9gLCBhbmQgYHRlc3QvZGVidWcvYCDigJQgYW55d2hlcmUgZWxzZSBpbiB0aGUgcHJvamVjdCAoZS5nLiBgdGVzdC9oZWxwZXJzL2AsIGBzcmMvYCwgb3IgdGhlXG4gKiBwcm9qZWN0IHJvb3QpLCB3YiB3b3VsZCBzaWxlbnRseSBza2lwIHRoZW0uIEEgcHJvamVjdCdzIG93biBQbGF5d3JpZ2h0IGNvbmZpZyBhbHNvIHJlcXVpcmVzXG4gKiBgdGVzdC9lMmVgIGZvciB0aGUgc2FtZSByZWFzb24uIGB0ZXN0L2ZpeHR1cmVzL2AgaXMgZXhlbXB0IGZyb20gdGhlIHRlc3QtZmlsZSBjaGVjayBiZWNhdXNlXG4gKiBmaXh0dXJlcyBtYXkgY29udGFpbiB0ZXN0IGZpbGVzIGFzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGVzdERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpO1xuICBjb25zdCB2aW9sYXRpb25zID0gWy4uLmZpbmRGaWxlU3lzdGVtVmlvbGF0aW9ucyhwcm9qZWN0LmRpclBhdGgpXTtcbiAgLy8gT25seSBhIHByb2plY3QncyBPV04gUGxheXdyaWdodCBjb25maWcgY291bnRzOiBhIHdvcmtzcGFjZSByb290IGxlZ2l0aW1hdGVseSBzaGFyZXMgYSByb290LWxldmVsXG4gIC8vIHBsYXl3cmlnaHQuY29uZmlnLnRzIHdoaWxlIGtlZXBpbmcgZTJlIHNwZWNzIGluIGEgc2luZ2xlIGFwcCBwYWNrYWdlLiBDaGVja2VkIG91dHNpZGUgdGhlXG4gIC8vIG1lbW9pemVkIHdhbGsgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBjYWxsZXItc3VwcGxpZWQgcGFja2FnZUpzb24sIG5vdCBvbmx5IHRoZSBkaXJlY3RvcnkuXG4gIGlmIChcbiAgICAhcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGVzdERpclBhdGgsICdlMmUnKSlcbiAgKSB7XG4gICAgdmlvbGF0aW9ucy5wdXNoKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiB2aW9sYXRpb25zO1xufVxuXG4vLyBUaGUgcmVjdXJzaXZlIHdhbGsgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0IGFuZCBydW5zIGZvciB0aGUgc2FtZSBkaXJlY3RvcmllcyBmcm9tIGJvdGggYHdiIGxpbnRgXG4vLyBhbmQgYHdiIHRlc3RgIHdpdGhpbiBvbmUgYHdiIHZlcmlmeWAsIHNvIGl0cyByZXN1bHQgaXMgc2hhcmVkIHBlciBwcm9qZWN0IGRpcmVjdG9yeS5cbmNvbnN0IGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSgpOiB2b2lkIHtcbiAgZmlsZVN5c3RlbVZpb2xhdGlvbnNDYWNoZS5jbGVhcigpO1xufVxuXG5mdW5jdGlvbiBmaW5kRmlsZVN5c3RlbVZpb2xhdGlvbnMocHJvamVjdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY2FjaGVkVmlvbGF0aW9ucyA9IGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuZ2V0KHByb2plY3REaXJQYXRoKTtcbiAgaWYgKGNhY2hlZFZpb2xhdGlvbnMpIHJldHVybiBjYWNoZWRWaW9sYXRpb25zO1xuXG4gIGNvbnN0IHZpb2xhdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHRlc3REaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXJQYXRoLCAndGVzdCcpO1xuICBpZiAoZnMuZXhpc3RzU3luYyh0ZXN0RGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKHRlc3REaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIC8vIE9TIGFuZCBlZGl0b3IgYXJ0aWZhY3RzIHN1Y2ggYXMgLkRTX1N0b3JlIGFyZSBlbnZpcm9ubWVudCBub2lzZSwgbm90IGxheW91dCBtaXN0YWtlcy5cbiAgICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgIUFMTE9XRURfVEVTVF9ESVJFQ1RPUllfTkFNRVMuaGFzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaChgdGVzdC8ke2VudHJ5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbGxlY3RTdHJheVRlc3RGaWxlcyhwcm9qZWN0RGlyUGF0aCwgJycsIHZpb2xhdGlvbnMpO1xuICAvLyBBIHRlc3QgZmlsZSBkaXJlY3RseSB1bmRlciB0ZXN0LyBpcyByZXBvcnRlZCBieSBib3RoIHRoZSB0b3AtbGV2ZWwgY2hlY2sgYW5kIHRoZSBzdHJheS1maWxlIHdhbGsuXG4gIGNvbnN0IHVuaXF1ZVZpb2xhdGlvbnMgPSBbLi4ubmV3IFNldCh2aW9sYXRpb25zKV07XG4gIGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuc2V0KHByb2plY3REaXJQYXRoLCB1bmlxdWVWaW9sYXRpb25zKTtcbiAgcmV0dXJuIHVuaXF1ZVZpb2xhdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJheVRlc3RGaWxlcyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZURpclBhdGg6IHN0cmluZywgdmlvbGF0aW9uczogc3RyaW5nW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIC8vIEhpZGRlbiBlbnRyaWVzICguZ2l0LCAudG1wLCAubmV4dCwgLi4uKSBhbmQgZGVwZW5kZW5jaWVzIGFyZSBub3QgcHJvamVjdC1hdXRob3JlZCB0ZXN0IGxvY2F0aW9uczpcbiAgICAvLyB0aGUgY29udmVudGlvbiBwbGFjZXMgdGVzdHMgb25seSB1bmRlciB0ZXN0Lywgc28gYSB0ZXN0IGZpbGUgaW4gYSBoaWRkZW4gZGlyZWN0b3J5IChlLmcuXG4gICAgLy8gLnN0b3J5Ym9vaykgaXMgb3V0c2lkZSB0aGUgaW5wdXQgY29udHJhY3QsIGFuZCBlbnVtZXJhdGluZyBlbnZpcm9ubWVudGFsIGhpZGRlbiBkaXJlY3Rvcmllc1xuICAgIC8vIGluc3RlYWQgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gYW55IHVubGlzdGVkIGdlbmVyYXRlZCBvbmUgKC50dXJibywgLndyYW5nbGVyLCAuLi4pLiBWaXNpYmxlXG4gICAgLy8gYnVpbGQgb3V0cHV0cyBzdWNoIGFzIGRpc3QvIGFyZSBkZWxpYmVyYXRlbHkgTk9UIHNraXBwZWQ6IHdiZnktbWFuYWdlZCBidWlsZHMgbmV2ZXIgZW1pdFxuICAgIC8vIHRlc3QtcGF0dGVybiBmaWxlcyB0aGVyZSwgc28gYW55IG1hdGNoIGlzIGFuIGF1dGhvcmVkIGZpbGUgd29ydGggZmxhZ2dpbmcuXG4gICAgLy8gU3ltbGlua3MgZmFpbCBgaXNEaXJlY3RvcnkoKWAgb24gYSBEaXJlbnQsIHNvIGN5Y2xlcyBhcmUgaW1wb3NzaWJsZS5cbiAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykgfHwgZW50cnkubmFtZSA9PT0gJ25vZGVfbW9kdWxlcycpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlRGlyUGF0aCA/IGAke3JlbGF0aXZlRGlyUGF0aH0vJHtlbnRyeS5uYW1lfWAgOiBlbnRyeS5uYW1lO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyB0ZXN0L3VuaXQsIHRlc3QvZTJlLCBhbmQgdGVzdC9kZWJ1ZyBob2xkIHRoZSBydW5uYWJsZSB0ZXN0czsgdGVzdC9maXh0dXJlcyBtYXkgY29udGFpblxuICAgICAgLy8gdGVzdCBmaWxlcyBhcyBkYXRhLlxuICAgICAgaWYgKHJlbGF0aXZlRGlyUGF0aCA9PT0gJ3Rlc3QnICYmIChSVU5OQUJMRV9URVNUX0RJUkVDVE9SWV9OQU1FUy5oYXMoZW50cnkubmFtZSkgfHwgZW50cnkubmFtZSA9PT0gJ2ZpeHR1cmVzJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBIG5lc3RlZCBwYWNrYWdlIChlLmcuIGEgd29ya3NwYWNlIG1lbWJlcikgaXMgdmFsaWRhdGVkIGFzIGl0cyBvd24gcHJvamVjdC5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgcmVsYXRpdmVQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICAgIGNvbGxlY3RTdHJheVRlc3RGaWxlcyhwcm9qZWN0RGlyUGF0aCwgcmVsYXRpdmVQYXRoLCB2aW9sYXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKFRFU1RfRklMRV9OQU1FX1JFR0VYUC50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdE5hbWU6IHN0cmluZywgdmlvbGF0aW9uczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBjaGFsay5yZWQoXG4gICAgICBgSW52YWxpZCB0ZXN0IGxheW91dCBpbiAke3Byb2plY3ROYW1lfS4gdGVzdC8gbWF5IGNvbnRhaW4gb25seSB0aGUgdW5pdCwgZTJlLCBkZWJ1ZywgaGVscGVycywgYW5kIGZpeHR1cmVzIGRpcmVjdG9yaWVzLCB0ZXN0IGZpbGVzIG1heSBleGlzdCBvbmx5IHVuZGVyIHRlc3QvdW5pdC8sIHRlc3QvZTJlLywgYW5kIHRlc3QvZGVidWcvLCBhbmQgYSBQbGF5d3JpZ2h0IGNvbmZpZyByZXF1aXJlcyB0ZXN0L2UyZS86XFxuYCArXG4gICAgICAgIHZpb2xhdGlvbnMubWFwKCh2aW9sYXRpb24pID0+IGAgICR7dmlvbGF0aW9ufWApLmpvaW4oJ1xcbicpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgZXZlcnkgcHJvamVjdCdzIGxheW91dCB2aW9sYXRpb25zIGFuZCB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgYW55IHByb2plY3QgdmlvbGF0ZWQgdGhlXG4gKiBjb252ZW50aW9uLCBzbyBhIHNpbmdsZSBydW4gc3VyZmFjZXMgYWxsIG9mIHRoZW0gaW5zdGVhZCBvZiBvbmx5IHRoZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICduYW1lJyB8ICdwYWNrYWdlSnNvbic+W10pOiBib29sZWFuIHtcbiAgbGV0IHZpb2xhdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnN0IHZpb2xhdGlvbnMgPSBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdCk7XG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdC5uYW1lLCB2aW9sYXRpb25zKTtcbiAgICB2aW9sYXRlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHZpb2xhdGVkO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi9zaGVsbC5qcyc7XG5cbmNvbnN0IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXTtcblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgZ2VuZXJhdGluZyBhIC5kZXYudmFycyBmaWxlICh2aWEgYHdiIGdlbi1kZXYtdmFyc2ApIHNvIHRoYXRcbiAqIGB3cmFuZ2xlciBkZXZgIGNhbiBzZWUgdGhlIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2OiBTY3JpcHRBcmd2LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3diJywgJ2dlbi1kZXYtdmFycycsIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSwgb3V0cHV0UGF0aF0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgYHdyYW5nbGVyIGRldmAtc3R5bGUgY29tbWFuZC4gYGVudiAtdSBDTE9VREZMQVJFX0VOVmAgbWFrZXMgd3JhbmdsZXIgc2VydmUgdGhlIHRvcC1sZXZlbFxuICogKG5vbi1kZXBsb3kpIGNvbmZpZy4gd3JhbmdsZXIgKGxpa2UgdmluZXh0KSByZXF1aXJlcyByZWFsIE5vZGUuanMg4oCUIGBidW4gcnVuYCByZXNwZWN0cyB0aGUgYmluJ3NcbiAqIG5vZGUgc2hlYmFuZywgYW5kIHdiIG5ldmVyIGNvbXBvc2VzIGAtLWJ1bmAgKHdob3NlIG5vZGUtPmJ1biBQQVRIIHNoaW0gYnJlYWtzIGJvdGggdG9vbHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoYXJnczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlYgWUFSTiB3cmFuZ2xlciAke2FyZ3N9YC50cmltKCk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGFwcGx5aW5nIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIHRvIHRoZSBsb2NhbCBkYXRhYmFzZSwgb3IgdW5kZWZpbmVkXG4gKiBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2Ugb3Igbm8gd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LlxuICogQ0k9dHJ1ZSBzdXBwcmVzc2VzIHdyYW5nbGVyJ3MgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lIHx8ICFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIHJldHVybiBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgO1xufVxuXG4vKipcbiAqIFByZWZpeCB0aGUgZ2l2ZW4gc2NyaXB0IHdpdGggY29tbWFuZHMgZXhwb3J0aW5nIERBVEFCQVNFX1VSTCBwb2ludGluZyB0byB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLFxuICogc28gdGhhdCBkcml6emxlLWtpdCBhbmQgc2VlZCBzY3JpcHRzIGNhbiBvcGVyYXRlIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSBhcHAuXG4gKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBpbiBpdHMgd3JhbmdsZXIgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4sIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lKSByZXR1cm4gc2NyaXB0O1xuXG4gIC8vIEV4Y2x1ZGluZyBtaW5pZmxhcmUncyBtZXRhZGF0YS5zcWxpdGUsIHdoaWNoIGxpdmVzIG5leHQgdG8gdGhlIGhhc2gtbmFtZWQgZGF0YWJhc2UgZmlsZS5cbiAgLy8gQW4gdW5tYXRjaGVkIGdsb2IgY2Fubm90IGhhcHBlbiBoZXJlOiB0aGUgc2NyaXB0IHJ1bnMgdW5kZXIgL2Jpbi9zaCAodmlhIE5vZGUncyBgc2hlbGw6IHRydWVgKSxcbiAgLy8gYW5kIHRoZSBwcmVjZWRpbmcgbWF0ZXJpYWxpemF0aW9uIGNvbW1hbmQgZ3VhcmFudGVlcyB0aGUgU1FMaXRlIGZpbGUgZXhpc3RzLlxuICAvLyBQcm9qZWN0cyB3aXRoIG11bHRpcGxlIEQxIGRhdGFiYXNlcyBhcmUgbm90IHN1cHBvcnRlZDogdGhlIGhhc2gtbmFtZWQgZmlsZXMgY2Fubm90IGJlXG4gIC8vIGRpc3Rpbmd1aXNoZWQgY2hlYXBseSAobWF0ZXJpYWxpemF0aW9uIGRvZXMgbm90IGV2ZW4gdXBkYXRlIHRoZSB0YXJnZXQgZmlsZSdzIG10aW1lKS5cbiAgLy8gVGhlIHN0YXRlIGRpcmVjdG9yeSBtdXN0IGJlIGFic29sdXRlIGJlY2F1c2UgdGhlIHdyYXBwZWQgc2NyaXB0IG1heSBgY2RgIHRvIHRoZSBtb25vcmVwbyByb290LlxuICBjb25zdCBzdGF0ZURpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCkpO1xuICBjb25zdCBleHBvcnRDb21tYW5kID0gYGV4cG9ydCBEQVRBQkFTRV9VUkw9XCJmaWxlOiQobHMgXCIke3N0YXRlRGlyUGF0aH1cIi92My9kMS9taW5pZmxhcmUtRDFEYXRhYmFzZU9iamVjdC8qLnNxbGl0ZSB8IGdyZXAgLXYgbWV0YWRhdGEgfCBoZWFkIC0xKVwiYDtcbiAgcmV0dXJuIGAke2J1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0LCBkYXRhYmFzZU5hbWUpfSAmJiAke2V4cG9ydENvbW1hbmR9ICYmICR7c2NyaXB0fWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBEMSBkYXRhYmFzZSBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG5cbiAgcmV0dXJuIHNjYW5XcmFuZ2xlckNvbmZpZ1ZhbHVlKGNvbmZpZ1BhdGgsICdkYXRhYmFzZV9uYW1lJyk7XG59XG5cbi8vIExvb2tlZCB1cCBmcm9tIG1hbnkgY2FsbCBzaXRlcyAoZnJhbWV3b3JrIGRldGVjdGlvbiwgd29ya2VyLXR5cGVzIGdlbmVyYXRpb24sIGRlcGxveSwgdGVzdCksIHNvXG4vLyB0aGUgZXhpc3RlbmNlIHByb2JlcyBhcmUgc2hhcmVkLiBLZXllZCBvbiB0aGUgcHJvamVjdCBPQkpFQ1QgKG5vdCBpdHMgZGlyZWN0b3J5IHBhdGgpOiB0aGUgc2FtZVxuLy8gc2hhcmVkIFByb2plY3QgaW5zdGFuY2UgZmxvd3MgdGhyb3VnaCBldmVyeSBjYWxsIHNpdGUgd2l0aGluIG9uZSBpbnZvY2F0aW9uLCB3aGlsZSBjYWxsZXJzIHRoYXRcbi8vIHJld3JpdGUgY29uZmlncyBhbmQgcGFzcyBmcmVzaCBwYXJ0aWFsIG9iamVjdHMgbXVzdCBvYnNlcnZlIHRoZSBjdXJyZW50IGRpc2sgc3RhdGUuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ1BhdGhDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgeyBjb25maWdQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfT4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gVGVzdHMgbWF5IHBhc3MgcGFydGlhbCBQcm9qZWN0IG9iamVjdHMgd2l0aG91dCBkaXJQYXRoLlxuICBpZiAoIXByb2plY3QuZGlyUGF0aCkgcmV0dXJuO1xuICBjb25zdCBjYWNoZWQgPSB3cmFuZ2xlckNvbmZpZ1BhdGhDYWNoZS5nZXQocHJvamVjdCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQuY29uZmlnUGF0aDtcblxuICBjb25zdCBjb25maWdQYXRoID0gd3JhbmdsZXJDb25maWdGaWxlTmFtZXNcbiAgICAubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZU5hbWUpKVxuICAgIC5maW5kKChmaWxlUGF0aCkgPT4gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpO1xuICB3cmFuZ2xlckNvbmZpZ1BhdGhDYWNoZS5zZXQocHJvamVjdCwgeyBjb25maWdQYXRoIH0pO1xuICByZXR1cm4gY29uZmlnUGF0aDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggb2YgdGhlIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIGRpcmVjdG9yeSAoYG1pZ3JhdGlvbnNfZGlyYCBpbiB0aGUgd3JhbmdsZXJcbiAqIGNvbmZpZywgZGVmYXVsdGluZyB0byBgbWlncmF0aW9uc2ApIGlmIGl0IGV4aXN0cyBvbiBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5qb2luKFxuICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoLCAnbWlncmF0aW9uc19kaXInKSA/PyAnbWlncmF0aW9ucydcbiAgKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpID8gbWlncmF0aW9uc0RpclBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIGRlY2xhcmVkIGZvciB0aGUga2V5IGluIHRoZSB3cmFuZ2xlciBjb25maWcsIGNvdmVyaW5nIEpTT04oQylcbiAqIChgXCJrZXlcIjogXCIuLi5cImApIGFuZCBUT01MLCBpbmNsdWRpbmcgaXRzIGlubGluZS10YWJsZSBmb3JtIChgZDFfZGF0YWJhc2VzID0gW3sgLi4uLCBrZXkgPSBcIi4uLlwiIH1dYCksXG4gKiB3aXRob3V0IGZ1bGwgcGFyc2Vycy4gQ29tbWVudGVkLW91dCBsaW5lcyBhcmUgc2tpcHBlZCBzbyB0aGF0IHRoZXkgY2Fubm90IHNoYWRvdyB0aGUgYWN0aXZlXG4gKiB2YWx1ZSwgYW5kIHRoZSBrZXkgbXVzdCBmb2xsb3cgYSBsaW5lIHN0YXJ0LCBge2Agb3IgYCxgIHNvIHRoYXQgcHJvc2UgbWVudGlvbmluZyBpdCBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIHNjYW5XcmFuZ2xlckNvbmZpZ1ZhbHVlKGNvbmZpZ1BhdGg6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlWYWx1ZVBhdHRlcm4gPSBuZXcgUmVnRXhwKGAoPzpefFsse10pXFxcXHMqW1wiJ10/JHtrZXl9W1wiJ10/XFxcXHMqWzo9XVxcXFxzKltcIiddKFteXCInXSspW1wiJ11gLCAndScpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSBrZXlWYWx1ZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIG1hdGVyaWFsaXppbmcgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqIEEgbm8tb3AgcXVlcnkgZm9yY2VzIG1pbmlmbGFyZSB0byBjcmVhdGUgdGhlIFNRTGl0ZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LlxuICogT25seSBzdGRvdXQgaXMgc3VwcHJlc3NlZDsgd3JhbmdsZXIgcmVwb3J0cyBlcnJvcnMgb24gc3RkZXJyLCB3aGljaCBtdXN0IHN0YXkgdmlzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPiwgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFlBUk4gd3JhbmdsZXIgZDEgZXhlY3V0ZSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWNvbW1hbmQgXCJTRUxFQ1QgMVwiID4gL2Rldi9udWxsYDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxvY2FsIHdyYW5nbGVyL21pbmlmbGFyZSBzdGF0ZSBkaXJlY3RvcnkuXG4gKiBEZXZlbG9wbWVudCBmb2xsb3dzIHdyYW5nbGVyJ3MgZGVmYXVsdCBkaXJlY3Rvcnkgc28gdGhhdCBwbGFpbiBgd3JhbmdsZXIgZGV2YCAvIGB2aW5leHQgZGV2YFxuICogKHdpdGhvdXQgYSBwZXJzaXN0LXBhdGggb3ZlcnJpZGUpIHNoYXJlcyB0aGUgc2FtZSBkYXRhYmFzZSBhcyB3Yi1tYW5hZ2VkIGRiIGNvbW1hbmRzLlxuICogT3RoZXIgZW52aXJvbm1lbnRzIChlLmcuIHRlc3QpIGdldCB0aGVpciBvd24gZGlyZWN0b3J5IHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzZXRcbiAqIHdpdGhvdXQgZGVzdHJveWluZyBkZXZlbG9wbWVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB7XG4gIC8vIERlc3RydWN0aXZlIHRlc3QgcmVzZXRzIGFyZSBnYXRlZCBvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpLCB3aGljaCBhY2NlcHRzXG4gIC8vIGVpdGhlciBXQl9FTlYgb3IgTUlTRV9FTlY7IHJlc29sdmUgdG8gdGhlIHRlc3QgZGlyZWN0b3J5IHdoZW5ldmVyIGVpdGhlciBzYXlzICd0ZXN0JyBzb1xuICAvLyB0aGF0IHN1Y2ggcmVzZXRzIGNhbiBuZXZlciB0YXJnZXQgdGhlIGRldmVsb3BtZW50IHN0YXRlLlxuICBjb25zdCB3YkVudiA9IFtwcm9qZWN0LmVudi5XQl9FTlYsIHByb2plY3QuZW52Lk1JU0VfRU5WXS5pbmNsdWRlcygndGVzdCcpXG4gICAgPyAndGVzdCdcbiAgICA6IHByb2plY3QuZW52LldCX0VOViB8fCBwcm9qZWN0LmVudi5NSVNFX0VOVjtcbiAgcmV0dXJuICF3YkVudiB8fCB3YkVudiA9PT0gJ2RldmVsb3BtZW50JyA/ICcud3JhbmdsZXIvc3RhdGUnIDogYC53cmFuZ2xlci9zdGF0ZS0ke3diRW52fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIHJlc29sdmVGYWxsYmFja1diRW52LFxuICBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi91dGlscy9lbnZTb3VyY2VzLmpzJztcbmltcG9ydCB7IGhhc0J1bkRpcmVjdG9yeU1hcmtlciwgaXNCdW5QYWNrYWdlTWFuYWdlciwgaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB7IGNsZWFyVGVzdFN0cnVjdHVyZUNhY2hlIH0gZnJvbSAnLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuLyoqIFRoZSBmaWxlIGB3cmFuZ2xlciB0eXBlc2Agd3JpdGVzIGJ5IGRlZmF1bHQuICovXG5jb25zdCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FID0gJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2VzQnVuUGFja2FnZU1hbmFnZXI7XG4gIH1cblxuICAvLyBUaGUgcGFja2FnZSBtYW5hZ2VyIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2I6XG4gIC8vIGBub2RlIHdiIC4uLmAgYWdhaW5zdCBhIEJ1biByZXBvIG11c3Qgc3RpbGwgcnVuIGBidW4gaW5zdGFsbGAsIGFuZCB2aWNlIHZlcnNhLlxuICBnZXQgcGFja2FnZU1hbmFnZXJDb21tYW5kKCk6ICdidW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZCgpOiAnYnVuIHJ1bicgfCAneWFybicge1xuICAgIHJldHVybiB0aGlzLmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgc2lnbmFsIGRlY2lkZXMgZXZlcnkgYnVuLXZzLXlhcm4gYnJhbmNoIGluIHdiIChzY3JpcHQgbm9ybWFsaXphdGlvbiBpbmNsdWRlZCk6XG4gIC8vIHNwbGl0dGluZyB0aGUgdG9vbC1tYW5pZmVzdCBzaWduYWwgZnJvbSB0aGUgbG9ja2ZpbGUgc2lnbmFsIG9uY2UgcHJvZHVjZWQgY29tbWFuZHMgbWl4aW5nXG4gIC8vIGBidW4gaW5zdGFsbGAgd2l0aCBgeWFybiBwcmlzbWEgLi4uYCBpbiBtaXNlLXBpbm5lZCByZXBvcyB3aG9zZSBidW4ubG9jayBpcyBnaXRpZ25vcmVkLlxuICBAbWVtb2l6ZU9uZVxuICBnZXQgdXNlc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnJvb3RQYWNrYWdlSnNvbj8ucGFja2FnZU1hbmFnZXIgPz8gdGhpcy5wYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlcjtcbiAgICBpZiAoaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyKHBhY2thZ2VNYW5hZ2VyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChoYXNCdW5EaXJlY3RvcnlNYXJrZXIodGhpcy5yb290RGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBpc0J1blBhY2thZ2VNYW5hZ2VyKHBhY2thZ2VNYW5hZ2VyKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICAvKiogQSB3b3Jrc3BhY2Ugcm9vdCB3aXRob3V0IHNvdXJjZXMgb2YgaXRzIG93biBydW5zIG5laXRoZXIgbGludCBub3IgdHlwZWNoZWNrIGNvbW1hbmRzLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3duU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCB0aGlzLmhhc1NvdXJjZUNvZGU7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBwcml2YXRlIGRlY2xhcmVkRW52S2V5Q2FjaGU6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGUgUFJPSkVDVCBkZWNsYXJlcyAoaXRzIGZub3gvLmVudiBzb3VyY2VzKSwgZXhjbHVkaW5nXG4gICAqIGJvdGggdGhlIGFtYmllbnQgcHJvY2VzcyBlbnZpcm9ubWVudCBhbmQgdGhlIGBtaXNlIGVudmAgcHNldWRvLXNvdXJjZSB0aGF0IHJlcG9ydHMgaG9zdC90b29sXG4gICAqIHZhcmlhYmxlcyBzdWNoIGFzIFBBVEguIGBlbnZgIGNhbm5vdCBhbnN3ZXIgdGhpczogaXQgbWVyZ2VzIHByb2Nlc3MuZW52LCBzbyBhIHByb2plY3QgdmFyaWFibGVcbiAgICogaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBpbmhlcml0ZWQgb25lIHRoZXJlLlxuICAgKi9cbiAgZ2V0IGRlY2xhcmVkRW52S2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZSkgcmV0dXJuIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZTtcbiAgICBpZiAoIXRoaXMubG9hZEVudikge1xuICAgICAgdGhpcy5kZWNsYXJlZEVudktleUNhY2hlID0gbmV3IFNldCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgWywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGUgPSBzZWxlY3RGbm94U291cmNlZEtleXMoZW52U291cmNlcyk7XG4gICAgcmV0dXJuIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZTtcbiAgfVxuXG4gIC8vIENhY2hlZCBpbiBhIHBsYWluIGZpZWxkIHJhdGhlciB0aGFuIHdpdGggQG1lbW9pemVPbmU6IHRoYXQgZGVjb3JhdG9yIGtleXMgaXRzIGNhY2hlIG9uIGEgaGFzaFxuICAvLyBvZiB0aGUgaW5zdGFuY2UsIHdoaWNoIGNoYW5nZXMgYXMgb3RoZXIgbWVtb2l6ZWQgZ2V0dGVycyBwb3B1bGF0ZSB0aGUgaW5zdGFuY2UsIHNvIGBlbnZgIGNvdWxkXG4gIC8vIHNpbGVudGx5IGJlIHJlY29tcHV0ZWQg4oCUIGRyb3BwaW5nIGluLXBsYWNlIG11dGF0aW9ucyAoZS5nLiBgcHJvamVjdC5lbnYuUE9SVCB8fD0g4oCmYCwgb3IgdGhlXG4gIC8vIHNlY3JldHMgYHdiIGRlcGxveWAgbWVyZ2VzIGZyb20gLmVudi5jbG91ZGZsYXJlKSB0aGF0IGNhbGxlcnMgcmVseSBvbiBmb3Igc3Bhd25lZCBjb21tYW5kcy5cbiAgcHJpdmF0ZSBlbnZDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcblxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmVudkNhY2hlKSByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgICBpZiAoIXRoaXMubG9hZEVudikge1xuICAgICAgdGhpcy5lbnZDYWNoZSA9IHByb2Nlc3MuZW52O1xuICAgICAgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgfVxuXG4gICAgY29uc3QgW21lcmdlZEVudiwgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgdGhpcy5lbnZDYWNoZSA9IG1lcmdlZEVudjtcbiAgICAvLyBgbWlzZSBlbnZgIGlzIGV4Y2x1ZGVkOiBpdCByZXBvcnRzIHRvb2wtYWN0aXZhdGlvbiBvdXRwdXQgKGUuZy4gUEFUSCkgZXZlbiBpbiByZXBvcyB0aGF0XG4gICAgLy8gZGVjbGFyZSBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXQgYWxsLCB3aGljaCBtdXN0IG5vdCB0cmlnZ2VyIHRoZSBDSSBzdHJpY3RuZXNzIGJlbG93LlxuICAgIHRoaXMuY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52KGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnMuc29tZSgoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkpO1xuICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgYW5kIHZhbGlkYXRlcyB0aGUgcmVzb2x2ZWQgYFdCX0VOVmAgcGVyIHRoZSBvcmcgc3RhbmRhcmQgKHNlZSB0aGVcbiAgICogZ3VpZGVsaW5lcy1mb3ItbWlzZS1mbm94IHNraWxsKTpcbiAgICogLSBMb2NhbGx5LCBhbiB1bnNldCBgV0JfRU5WYCBmYWxscyBiYWNrIHRvIHRoZSBzZWxlY3RlZCBjYXNjYWRlIG1vZGUgKGRldmVsb3BtZW50IHVubGVzcyBhXG4gICAqICAgY29tbWFuZCBmb3JjZXMgYW5vdGhlciwgZS5nLiBgd2IgdGVzdGAgZm9yY2VzIHRlc3QpLCBzbyBjYXN1YWwgYGJ1biB3YiAuLi5gIGludm9jYXRpb25zXG4gICAqICAgd29yayBpbiByZXBvc2l0b3JpZXMgdGhhdCBkZWZpbmUgbm8gV0JfRU5WIGF0IGFsbC5cbiAgICogLSBPbiBDSSwgYW4gdW5zZXQgYFdCX0VOVmAgaXMgYSBoYXJkIGVycm9yIHdoZW4gZW52IHNvdXJjZXMgZXhpc3Q6IHdvcmtmbG93cyBtdXN0IGV4cG9ydCB0aGVcbiAgICogICBlbnZpcm9ubWVudCBleHBsaWNpdGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgcnVubmluZyBpbiBhbiBhbWJpZ3VvdXMgbW9kZS5cbiAgICogLSBUaGUgdmFsdWUgbXVzdCBuYW1lIGEgc3RhbmRhcmQgbW9kZTsgYW4gdW5rbm93biB2YWx1ZSAoZS5nLiBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmApIHdvdWxkXG4gICAqICAgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgZGV2ZWxvcG1lbnQgY2FzY2FkZSwgd2hpY2ggaXMgdGhlIGZhaWx1cmUgdGhpcyBndWFyZHMgYWdhaW5zdC5cbiAgICogLSBgTkVYVF9QVUJMSUNfV0JfRU5WYCBpcyBkZXJpdmVkIGZyb20gYFdCX0VOVmAgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgd2hlbiBtaXNzaW5nLCBzbyBhXG4gICAqICAgcHJvZHVjdGlvbiBidWlsZCBjYW4gbm8gbG9uZ2VyIGJha2UgYSBzdGFsZSBkZXZlbG9wbWVudCB2YWx1ZSBpbnRvIHRoZSBjbGllbnQgYnVuZGxlLlxuICAgKiBTa2lwcGVkIHdoZW4gYFdCX1NLSVBfRU5WX0NIRUNLPTFgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52KGhhc0Vudmlyb25tZW50U291cmNlczogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGVudiA9IHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCFlbnYpIHJldHVybjtcbiAgICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcblxuICAgIC8vIE9uIENJLCBXQl9FTlYgbXVzdCBiZSBFWFBPUlRFRCBieSB0aGUgd29ya2Zsb3cg4oCUIGNoZWNrZWQgYWdhaW5zdCBwcm9jZXNzLmVudiwgbm90IHRoZVxuICAgIC8vIG1lcmdlZCBlbnZpcm9ubWVudDogYSBjb21taXR0ZWQgYmFzZSBkZWZhdWx0IChlLmcuIGZub3gncyBkZXZlbG9wbWVudCBlbnRyeSkgd291bGRcbiAgICAvLyBvdGhlcndpc2Ugc2F0aXNmeSB0aGUgY2hlY2sgYW5kIHNpbGVudGx5IHJ1biBDSSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuICAgIGlmIChpc0NJKGVudi5DSSkgJiYgIXByb2Nlc3MuZW52LldCX0VOViAmJiBoYXNFbnZpcm9ubWVudFNvdXJjZXMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAnV0JfRU5WIGlzIG5vdCBleHBvcnRlZCBvbiBDSS4gRXhwb3J0IFdCX0VOViBleHBsaWNpdGx5ICh0aGUgcmV1c2FibGUgd29ya2Zsb3dzIHBhc3MgaXQgdmlhIHRoZSBcImVudmlyb25tZW50XCIgaW5wdXQpLCAnICtcbiAgICAgICAgICAgICdvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIWVudi5XQl9FTlYpIHtcbiAgICAgIC8vIFRoZSBzaGFyZWQgcmVzb2x2ZXIga2VlcHMgdGhpcyBmYWxsYmFjayBjb25zaXN0ZW50IHdpdGggdGhlIGNhc2NhZGUgc2VsZWN0aW9uIEFORCB3aXRoXG4gICAgICAvLyB0aGUgJHtXQl9FTlZ9IGV4cGFuc2lvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgYWxyZWFkeSBwZXJmb3JtZWQ6IHRoZSBmb3JjZWQgY2FzY2FkZVxuICAgICAgLy8gKGUuZy4gYHdiIHRlc3RgKSwgdGhlbiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0LCB0aGVuIHRoZSBBTUJJRU5ULU5PREVfRU5WLWRyaXZlbiBhdXRvXG4gICAgICAvLyBjYXNjYWRlIGNsYW1wZWQgdG8gYSBzdGFuZGFyZCBtb2RlIChhbiBleHBsaWNpdCAtLWNhc2NhZGUtZW52IGtlZXBzIGl0cyB2YWx1ZSBhbmQgaXNcbiAgICAgIC8vIHZhbGlkYXRlZCBiZWxvdyBsaWtlIGFueSBvdGhlciBXQl9FTlYpLlxuICAgICAgY29uc3QgbW9kZSA9IHJlc29sdmVGYWxsYmFja1diRW52KHRoaXMuYXJndik7XG4gICAgICBlbnYuV0JfRU5WID0gbW9kZTtcbiAgICAgIGlmIChoYXNFbnZpcm9ubWVudFNvdXJjZXMgJiYgIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFdCX0VOViBpcyBub3QgZGVmaW5lZDsgZGVmYXVsdGluZyB0byBcIiR7bW9kZX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFQcm9qZWN0LnN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZW52LldCX0VOVikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIG11c3QgYmUgb25lIG9mIGRldmVsb3BtZW50LCB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kdWN0aW9uLCBidXQgaXMgXCIke2Vudi5XQl9FTlZ9XCIuIGAgK1xuICAgICAgICAgICAgJ0ZpeCB0aGUgdmFsdWUgaW4gdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBBIGZvcmNlZCBtb2RlIChhbiBleHBsaWNpdC9jb21tYW5kLWRlZmF1bHQgLS1jYXNjYWRlLWVudiwgb3IgYW4gZXhwb3J0ZWQgV0JfRU5WIHdob3NlXG4gICAgLy8gcHJvZmlsZSB2YWx1ZXMgbWF5IG92ZXJyaWRlIGl0IGxvY2FsbHkgcGVyIGlzc3VlICM5MzApIG11c3Qgbm90IGJlIHNpbGVudGx5IHJlcGxhY2VkIGJ5XG4gICAgLy8gYW5vdGhlciBtb2RlIGFuIGVudiBzb3VyY2UgZGVmaW5lczogYHdiIHRlc3RgIHJlc29sdmluZyBXQl9FTlY9ZGV2ZWxvcG1lbnQgZnJvbSB0aGUgYmFzZVxuICAgIC8vIGZub3ggc2VjcmV0cyB3b3VsZCBydW4gdGhlIHRlc3RzIGFnYWluc3QgZGV2ZWxvcG1lbnQgdmFsdWVzLCBhbmQgYW4gZXhwb3J0ZWRcbiAgICAvLyBXQl9FTlY9cHJvZHVjdGlvbiBvdmVycmlkZGVuIHRvIGRldmVsb3BtZW50IGJ5IHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgd291bGQgYnVpbGQvZGVwbG95XG4gICAgLy8gdGhlIHdyb25nIGVudmlyb25tZW50IHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICAvLyAtLWNhc2NhZGUtbm9kZS1lbnYgZm9yY2VzIDxOT0RFX0VOViB8fCBkZXZlbG9wbWVudD4gKHBlciBpdHMgb3duIGRvY3VtZW50YXRpb24pLCByZWFkIGZyb21cbiAgICAvLyB0aGUgQU1CSUVOVCBlbnZpcm9ubWVudCBsaWtlIHRoZSBjYXNjYWRlIHNlbGVjdGlvbi4gT25seSBhIFNUQU5EQVJEIGZvcmNlZCBtb2RlIGlzIGVuZm9yY2VkOlxuICAgIC8vIGEgbm9uLXN0YW5kYXJkIG9uZSAoZS5nLiBOT0RFX0VOVj1xYSkgYWxyZWFkeSBoYWQgaXRzIGZhbGxiYWNrIGNsYW1wZWQgdG8gZGV2ZWxvcG1lbnQgYWJvdmUsXG4gICAgLy8gYW5kIGVycm9yaW5nIG9uIHRoYXQgY2xhbXAgd291bGQgY29udHJhZGljdCBpdC5cbiAgICBjb25zdCBmb3JjZWRNb2RlID1cbiAgICAgIHRoaXMuYXJndi5jYXNjYWRlRW52ID8/XG4gICAgICAodGhpcy5hcmd2LmNhc2NhZGVOb2RlRW52ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IHByb2Nlc3MuZW52LldCX0VOViB8fCB1bmRlZmluZWQpO1xuICAgIC8vIFRoZSBBVVRPLXNlbGVjdGVkIG1vZGUgY291bnRzIGFzIHRoZSBleHBlY3RhdGlvbiB0b286IHdpdGggbm90aGluZyBzZXQgYW55d2hlcmUsIHRoZVxuICAgIC8vIGRldmVsb3BtZW50IHZhbHVlcyBhcmUgbG9hZGVkLCBzbyBhbiBlbnYgc291cmNlIGRlY2xhcmluZyBXQl9FTlY9cHJvZHVjdGlvbiB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBydW4gZGV2ZWxvcG1lbnQgc291cmNlcyBsYWJlbGVkIGFzIHByb2R1Y3Rpb24uXG4gICAgY29uc3QgZXhwZWN0ZWRNb2RlID1cbiAgICAgIGZvcmNlZE1vZGUgPz8gKHRoaXMuYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpIDogdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGlzIGEgbGVnaXRpbWF0ZSBzZWNvbmQgZXhwZWN0YXRpb246IGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2BcbiAgICAvLyBsb2FkcyB0aGUgc3RhZ2luZyBmaWxlcyB3aGlsZSB0aGUgZmFsbGJhY2sgY29ycmVjdGx5IGZpbGxzIFdCX0VOVj10ZXN0LlxuICAgIGlmIChcbiAgICAgIGV4cGVjdGVkTW9kZSAmJlxuICAgICAgUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGV4cGVjdGVkTW9kZSkgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IGV4cGVjdGVkTW9kZSAmJlxuICAgICAgZW52LldCX0VOViAhPT0gdGhpcy5hcmd2LmNvbW1hbmREZWZhdWx0V2JFbnZcbiAgICApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtlbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRNb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgbW9kZSdzIGVudiBzb3VyY2UgKGUuZy4gdGhlIGZub3ggXCIke2V4cGVjdGVkTW9kZX1cIiBwcm9maWxlKSwgYCArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVxdWlyZXNOZXh0UHVibGljV2JFbnYgJiYgZW52Lk5FWFRfUFVCTElDX1dCX0VOViAhPT0gZW52LldCX0VOVikge1xuICAgICAgLy8gQXNzaWduIHVuY29uZGl0aW9uYWxseSwgbm90IGB8fD1gOiB0aGUgcGFpciBtdXN0IGFncmVlIGJ5IGNvbnZlbnRpb24sIGFuZCBhIHN0YWxlIHZhbHVlXG4gICAgICAvLyAoZS5nLiB0aGUgZm5veCBiYXNlIGRldmVsb3BtZW50IGRlZmF1bHQgd2hpbGUgQ0kgZXhwb3J0cyBXQl9FTlY9dGVzdCkgd291bGQgb3RoZXJ3aXNlXG4gICAgICAvLyBiZSBiYWtlZCBpbnRvIHRoZSBjbGllbnQgYnVuZGxlIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2ZXIgc2lkZSBydW5zIHdpdGggdGhlIGNvcnJlY3QgV0JfRU5WLlxuICAgICAgaWYgKGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgJiYgIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYE92ZXJyaWRpbmcgTkVYVF9QVUJMSUNfV0JfRU5WIChcIiR7ZW52Lk5FWFRfUFVCTElDX1dCX0VOVn1cIikgd2l0aCBXQl9FTlYgKFwiJHtlbnYuV0JfRU5WfVwiKS5gKTtcbiAgICAgIH1cbiAgICAgIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBlbnYuV0JfRU5WO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KCk6IGJvb2xlYW4ge1xuICAgIC8vIE9XTiBkZXBlbmRlbmNpZXMgb25seTogYSByb290LWxldmVsIG5leHQvdmluZXh0IGRldkRlcGVuZGVuY3kgaW4gYSBtaXhlZCBtb25vcmVwbyBtdXN0IG5vdFxuICAgIC8vIGZvcmNlIE5FWFRfUFVCTElDX1dCX0VOViBvbnRvIGV2ZXJ5IG5vbi1OZXh0IHdvcmtzcGFjZSBwYWNrYWdlLlxuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ25leHQnKSB8fCAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ZpbmV4dCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBgd3JhbmdsZXIgdHlwZXNgIHNob3VsZCBnZW5lcmF0ZSBgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c2AgaGVyZS4gQSB3cmFuZ2xlciBjb25maWdcbiAgICogYW5kIGFuIG93biB3cmFuZ2xlciBkZXBlbmRlbmN5IGFyZSBib3RoIHJlcXVpcmVkIOKAlCB3cmFuZ2xlciBleGl0cyBub24temVybyB3aXRob3V0IGEgY29uZmlnLFxuICAgKiBhbmQgaW4gYSBtaXhlZCBtb25vcmVwbyBhIHJvb3QtbGV2ZWwgd3JhbmdsZXIgZGV2RGVwZW5kZW5jeSBtdXN0IG5vdCBtYWtlIGV2ZXJ5IHdvcmtzcGFjZVxuICAgKiBwYWNrYWdlIGVtaXQgdHlwZXMgaXQgbmV2ZXIgY29uc3VtZXMuXG4gICAqXG4gICAqIFRoZSBwYWNrYWdlJ3Mgb3duIGNvbW1pdHRlZCBnaXRpZ25vcmUgcnVsZSBpcyB0aGUgdGhpcmQgc2lnbmFsLCBhbmQgdGhlIG9uZSB0aGF0IHNheXMgdGhlXG4gICAqIHBhY2thZ2UgYWN0dWFsbHkgQ09OU1VNRVMgdGhlIGZpbGU6IHdiZnkgd3JpdGVzIHRoYXQgcnVsZSBvbmx5IGZvciBwYWNrYWdlcyB3aG9zZSBvd24gdHNjb25maWdcbiAgICogY2FuIHJlZmVyZW5jZSBgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c2AsIGFuZCBkZWxpYmVyYXRlbHkgbGVhdmVzIGFsb25lIHBhY2thZ2VzIHRoYXRcbiAgICogaGFuZC1tYWludGFpbiB0aGVpciBgRW52YCBpbnN0ZWFkLiBXaXRob3V0IHRoaXMgY2hlY2ssIHN1Y2ggYSBwYWNrYWdlIHdvdWxkIGdhaW4gYW4gdW50cmFja2VkXG4gICAqIH41MDBLQiBnZW5lcmF0ZWQgZmlsZSBvbiBldmVyeSBpbnN0YWxsLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGdlbmVyYXRlc1dvcmtlclR5cGVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghZmluZFdyYW5nbGVyQ29uZmlnUGF0aCh0aGlzKSB8fCAhdGhpcy5oYXNPd25EZXBlbmRlbmN5KCd3cmFuZ2xlcicpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRGVmZW5zZSBpbiBkZXB0aCBhZ2FpbnN0IHdiZnkncyBnaXRpZ25vcmUgcnVsZSBhbmQgdGhpcyBwcmVkaWNhdGUgZHJpZnRpbmcgYXBhcnQ6IGlmIHRoZSBwYWNrYWdlIHN0aWxsXG4gICAgLy8gcnVucyBpdHMgb3duIG91dHB1dC1jaGFuZ2luZyBgd3JhbmdsZXIgdHlwZXNgIChlLmcuIGAtLXN0cmljdC12YXJzPWZhbHNlYCksIHRoZSBiYXJlIGludm9jYXRpb24gaGVyZSB3b3VsZFxuICAgIC8vIG92ZXJ3cml0ZSB0aGF0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCBgRW52YC5cbiAgICBpZiAoaGFzT3V0cHV0Q2hhbmdpbmdXcmFuZ2xlclR5cGVzKHRoaXMucGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzTWFuYWdlZEdpdGlnbm9yZVJ1bGUodGhpcy5kaXJQYXRoLCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICAvKiogQmxpdHogcmVwb3NpdG9yaWVzIGtlZXAgdGhlaXIgUHJpc21hIHNjaGVtYSBhbmQgU1FMaXRlIGRhdGFiYXNlcyB1bmRlciBkYi8gaW5zdGVhZCBvZiBwcmlzbWEvLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJpc21hRGlyTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdkYicsICdzY2hlbWEucHJpc21hJykpID8gJ2RiJyA6ICdwcmlzbWEnO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSk7XG4gICAgcmV0dXJuIGRvY2tlcmZpbGVEaXJQYXRoID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRvY2tlcmZpbGVEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwcm9qZWN0J3MgZW52IHNvdXJjZXMgYW5kIG1lcmdlcyB0aGVtIG92ZXIgcHJvY2Vzcy5lbnYsIHJlcG9ydGluZyBlYWNoIGxvYWRlZCBzb3VyY2UuXG4gKiBTaGFyZWQgYnkgUHJvamVjdC5lbnYgYW5kIGB3YiBydW5gJ3Mgc3RhbmRhbG9uZSAobWFuaWZlc3QtbGVzcykgZW52aXJvbm1lbnQgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRNZXJnZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgZGlyUGF0aCwge1xuICAgIC8vIENhbGxlcnMgZmlsbCBhbiB1bnNldCBXQl9FTlYgd2l0aCB0aGUgc2FtZSBmYWxsYmFjayBhZnRlcndhcmRzLCBzbyBleHBhbmRpbmcgJHtXQl9FTlZ9XG4gICAgLy8gcmVmZXJlbmNlcyBhZ2FpbnN0IGl0IGtlZXBzIHRoZSBwYWlyIGNvbnNpc3RlbnQuXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudjogdHJ1ZSxcbiAgfSk7XG4gIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KSkge1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke25hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICAvLyBTcHJlYWRpbmcgZW52VmFycyBsYXN0IGlzIHNhZmUgZm9yIGV4cG9ydGVkLXZhcmlhYmxlIHByZWNlZGVuY2U6IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAvLyBhbHJlYWR5IGV4Y2x1ZGVzIGtleXMgcHJlc2VudCBpbiBwcm9jZXNzLmVudiBmcm9tIC5lbnYvZm5veCBzb3VyY2VzIChyZXR1cm5pbmcgYSBrZXkgdGhhdFxuICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gIC8vIChlLmcuIGAtLWNhc2NhZGUtZW52PXRlc3RgKSB3aW5zIG92ZXIgYSBzdGFsZSBgbWlzZSBhY3RpdmF0ZWAgZW52aXJvbm1lbnQuXG4gIHJldHVybiBbeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9LCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuLy8gUHJvamVjdCBjb25zdHJ1Y3Rpb24gcmUtcmVhZHMgbWFuaWZlc3RzIGFuZCBlbnYgc291cmNlcywgYW5kIGB3YiB2ZXJpZnlgIGNvbXBvc2VzIGNvbW1hbmRzXG4vLyAobGludCwgdHlwZWNoZWNrLCB0ZXN0KSB0aGF0IGVhY2ggcmVidWlsZCB0aGUgZ3JhcGgg4oCUIHNvIGluc3RhbmNlcyBhcmUgc2hhcmVkIHBlclxuLy8gKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpIHdpdGhpbiBvbmUgaW52b2NhdGlvbi4gU2hhcmluZyBpcyBzYWZlIGJlY2F1c2UgYVxuLy8gUHJvamVjdCBpcyBpbW11dGFibGUgZXhjZXB0IGZvciBlbnYgbXV0YXRpb25zIChlLmcuIGBwcm9qZWN0LmVudi5QT1JUIHx8PSAuLi5gKSwgd2hpY2ggY2FsbGVyc1xuLy8gZGVsaWJlcmF0ZWx5IHJlbHkgb24gc3RheWluZyB2aXNpYmxlIHRvIGxhdGVyIHN0ZXBzLiBUaGUgY2FjaGVzIGxpdmUgZm9yIHRoZSB3aG9sZSBwcm9jZXNzIGFuZFxuLy8gbmV2ZXIgb2JzZXJ2ZSBsYXRlciBmaWxlc3lzdGVtIG11dGF0aW9ucywgc28gY29kZSB0aGF0IHJld3JpdGVzIGEgcHJvamVjdCBkaXJlY3RvcnkgYW5kIG5lZWRzIGFcbi8vIGZyZXNoIHZpZXcgKHRvZGF5IG9ubHkgdGVzdHMpIG11c3QgY2FsbCBjbGVhclByb2plY3RDYWNoZXMgZmlyc3QuXG5jb25zdCBzZWxmUHJvamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb2plY3Q+KCk7XG5jb25zdCBkZXNjZW5kYW50UHJvamVjdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFByb2plY3RbXT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByb2plY3RDYWNoZXMoKTogdm9pZCB7XG4gIHNlbGZQcm9qZWN0Q2FjaGUuY2xlYXIoKTtcbiAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuY2xlYXIoKTtcbiAgY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9qZWN0Q2FjaGVLZXkoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbiwgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT25seSB0aGUgaW5wdXRzIGEgUHJvamVjdCBhY3R1YWxseSByZWFkcyBwYXJ0aWNpcGF0ZTogdGhlIGVudiBjYXNjYWRlIHNlbGVjdGlvblxuICAvLyAocmVhZEVudmlyb25tZW50VmFyaWFibGVzIC8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYgLyBjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpIGFuZCB0aGUgb3V0cHV0XG4gIC8vIHN3aXRjaGVzIChzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LCBidWlsZENvbW1hbmQncyAtLXZlcmJvc2UpLiBUaGUgYW1iaWVudFxuICAvLyBXQl9FTlYgLyBOT0RFX0VOViAvIENJIHZhbHVlcyBmZWVkIHRoZSBzYW1lIGNhc2NhZGUgc2VsZWN0aW9uIGFuZCBhcmUgbXV0YXRlZCBtaWQtcnVuIGJ5XG4gIC8vIGNvbW1hbmRzIHN1Y2ggYXMgYHdiIGRiIHJlc2V0YCAod2hpY2ggZm9yY2VzIFdCX0VOVj10ZXN0IGFuZCByZS1yZXNvbHZlcyBwcm9qZWN0cyksIHNvIHRoZXlcbiAgLy8gbXVzdCBwYXJ0aWNpcGF0ZSB0b28gb3IgdGhlIHNlY29uZCByZXNvbHV0aW9uIHdvdWxkIHJldXNlIGEgUHJvamVjdCB3aXRoIHRoZSB3cm9uZyBlbnYuXG4gIGNvbnN0IHsgYXV0b0Nhc2NhZGVFbnYsIGNhc2NhZGVFbnYsIGNhc2NhZGVOb2RlRW52LCBjb21tYW5kRGVmYXVsdFdiRW52LCBxdWlldEVudiwgdmVyYm9zZSB9ID0gYXJndjtcbiAgY29uc3QgeyBzaWxlbnQgfSA9IGFyZ3YgYXMgeyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgpLFxuICAgIGxvYWRFbnYsXG4gICAgYXV0b0Nhc2NhZGVFbnYsXG4gICAgY2FzY2FkZUVudixcbiAgICBjYXNjYWRlTm9kZUVudixcbiAgICBjb21tYW5kRGVmYXVsdFdiRW52LFxuICAgIHF1aWV0RW52LFxuICAgIHZlcmJvc2UsXG4gICAgc2lsZW50LFxuICAgIHByb2Nlc3MuZW52LldCX0VOVixcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICBwcm9jZXNzLmVudi5DSSxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVLZXkgPSBidWlsZFByb2plY3RDYWNoZUtleShhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgbGV0IHByb2plY3QgPSBzZWxmUHJvamVjdENhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICBzZWxmUHJvamVjdENhY2hlLnNldChjYWNoZUtleSwgcHJvamVjdCk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QuZW52LldCX0VOViA9PT0gbmFtZSB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gbmFtZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcbiAgaWYgKHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCAhPT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmKSB7XG4gICAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdIH07XG4gIH1cblxuICBjb25zdCBjYWNoZUtleSA9IGJ1aWxkUHJvamVjdENhY2hlS2V5KGFyZ3YsIGxvYWRFbnYsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgbGV0IGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFkZXNjZW5kYW50cykge1xuICAgIGRlc2NlbmRhbnRzID0gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudik7XG4gICAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuc2V0KGNhY2hlS2V5LCBkZXNjZW5kYW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IGF3YWl0IGRlc2NlbmRhbnRzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0aGlzUHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCF0aGlzUHJvamVjdCkgcmV0dXJuO1xuXG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIHJvb3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIHJvb3REaXJQYXRoKSA/PyB0aGlzUHJvamVjdDtcbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBwcm9qZWN0IGZvbGxvd2VkIGJ5IG9uZSBQcm9qZWN0IHBlciB3b3Jrc3BhY2UgZGlyZWN0b3J5IHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzXG4gKiBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayAoaXNzdWUgIzEwMDgpOiBCdW4gcmVwb3MgdXNlIHRoZSBzaGFyZWQgQnVuLWV4YWN0IHJlc29sdmVyXG4gKiAobmVnYXRpb25zLCBwaW5uZWQgcG9zaXRpdmVzLCBhbmQgYmFzZWxpbmUtc2VlZGluZyBuZWdhdGlvbnMgaW5jbHVkZWQpLCB3aGlsZSBZYXJuIHJlcG9zIGtlZXBcbiAqIGdsb2Igc2VtYW50aWNzIOKAlCBCdW4tb25seSBydWxlcyBzdWNoIGFzIHRoZSBpbXBsaWNpdCBiYXNlbGluZSB3b3VsZCBpbnZlbnQgd29ya3NwYWNlcyBZYXJuXG4gKiBuZXZlciBsaW5rcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocm9vdFByb2plY3QpO1xuICByZXR1cm4gW1xuICAgIHJvb3RQcm9qZWN0LFxuICAgIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcChcbiAgICAgIC8vIFRoZSBmYWxsYmFjayBrZWVwcyBhIHdvcmtzcGFjZSB3aG9zZSBtYW5pZmVzdCB2YW5pc2hlZCBhZnRlciB0aGUgZ2xvYiAoZmluZFNlbGZQcm9qZWN0XG4gICAgICAvLyB3b3VsZCBkcm9wIGl0KSBkaXNjb3ZlcmVkLCBtYXRjaGluZyB0aGUgbG9uZy1zdGFuZGluZyBkaXJlY3QgY29uc3RydWN0aW9uLlxuICAgICAgKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCB3b3Jrc3BhY2VEaXJQYXRoKSA/PyBuZXcgUHJvamVjdCh3b3Jrc3BhY2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KVxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogVGhlIGFic29sdXRlIGRpcmVjdG9yeSBvZiBldmVyeSB3b3Jrc3BhY2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyIHdvdWxkIGxpbmssXG4gKiBtYXRjaGluZyB0aGUgbWFuYWdlciB0aGUgd2F5IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyBkZXNjcmliZXMuIEV4cG9ydGVkIGZvciB3YiByZWxlYXNlLCB3aG9zZVxuICogcGx1Z2luIGluc3BlY3Rpb24sIG5vZGVfbW9kdWxlcyBjbGVhbnVwLCBhbmQgbWFuaWZlc3QgcmV3cml0aW5nIG11c3Qgc2VlIHRoZSBzYW1lIHdvcmtzcGFjZSBzZXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzLCBwcm9qZWN0LmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgKTtcbiAgfVxuICAvLyBZYXJuIDEuMjIuMjIgcmVzb2x2ZXMgZWFjaCBkZWNsYXJlZCBwYXR0ZXJuIChhcnJheSBvciBgeyBwYWNrYWdlczogW+KApl0gfWAgZm9ybSkgaW5kZXBlbmRlbnRseVxuICAvLyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLCBzbyBhIGxlYWRpbmctYCFgIHBhdHRlcm4gaXMgbm90IGFuIGV4Y2x1c2lvbiDigJQgYFtcInBhY2thZ2VzLypcIixcbiAgLy8gXCIhcGFja2FnZXMvYVwiXWAgc3RpbGwgbGlua3MgcGFja2FnZXMvYS4gWWFybiBhZGRpdGlvbmFsbHkgaWdub3JlcyBtYW5pZmVzdHMgbWlzc2luZyBhIG5hbWUgb3JcbiAgLy8gdmVyc2lvbiAoXCJNaXNzaW5nIHZlcnNpb24gaW4gd29ya3NwYWNlIOKApiwgaWdub3JpbmcuXCIpLCBidXQgdGhhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIG1pcnJvcmVkOlxuICAvLyB3YidzIGRlc2NlbmRhbnQgZGlzY292ZXJ5IGV4aXN0cyB0byBydW4gY29tbWFuZHMgKGxpbnQsIHRlc3QsIHR5cGVjaGVjaywg4oCmKSBpbiBzdWItcGFja2FnZXMsXG4gIC8vIGFuZCB2ZXJzaW9uLWxlc3MgcHJpdmF0ZSBwYWNrYWdlcyBtdXN0IHN0YXkgZGlzY292ZXJlZCDigJQgdGhlIGxvbmctc3RhbmRpbmcgYmVoYXZpb3Igd2Inc1xuICAvLyBtb25vcmVwbyBmaXh0dXJlcyBlbmNvZGUuIEdsb2IgZm9yIHRoZSBtYW5pZmVzdHMgdGhlbXNlbHZlczogZ2xvYmJ5J3MgYG9ubHlEaXJlY3Rvcmllc2BcbiAgLy8gd291bGQgcmV0dXJuIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybidzIENISUxEUkVOIGluc3RlYWQgb2YgdGhlIGRpcmVjdG9yeS4gVGhlIHJlYWxwYXRoXG4gIC8vIGNvbnRhaW5tZW50IG1pcnJvcnMgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHM6IGEgd29ya3NwYWNlIHN5bWxpbmsgZXNjYXBpbmcgdGhlXG4gIC8vIHJlcG9zaXRvcnkgbXVzdCBub3QgbGV0IGNvbnN1bWVycyB0b3VjaCBhbm90aGVyIGNoZWNrb3V0LlxuICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpLmZpbHRlcihcbiAgICAocGF0dGVybikgPT4gIXBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybihwYXR0ZXJuKVxuICApO1xuICBpZiAocG9zaXRpdmVQYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgLy8gZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlIOKAlCBnbG9iYnkgd291bGQgb3RoZXJ3aXNlIGV4cGFuZCBhIGxpdGVyYWwgZGlyZWN0b3J5IHBhdHRlcm4gdG8gaXRzXG4gIC8vIENISUxEUkVOLCB0dXJuaW5nIGUuZy4gYHBhY2thZ2VzYCBpbnRvIG1hdGNoZXMgZm9yIGV2ZXJ5IHBhY2thZ2VzLyogc3ViZGlyZWN0b3J5LlxuICBjb25zdCBnbG9iYnlPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGV4cGFuZERpcmVjdG9yaWVzOiBmYWxzZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gIH07XG4gIC8vIGZhc3QtZ2xvYiAoZ2xvYmJ5J3MgZW5naW5lKSByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCkgYWx0aG91Z2ggWWFybiBsaW5rcyBzdWNoIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnNcbiAgLy8gb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnkgZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmdcbiAgLy8gdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpciBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IuXG4gIGNvbnN0IGdsb2JiZWRNYW5pZmVzdFBhdGhzID0gYXdhaXQgZ2xvYmJ5KFxuICAgIHBvc2l0aXZlUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICBnbG9iYnlPcHRpb25zXG4gICk7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aFNldCA9IG5ldyBTZXQoZ2xvYmJlZE1hbmlmZXN0UGF0aHMpO1xuICBjb25zdCBxdWVzdGlvbk1hcmtQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCc/JykpO1xuICBpZiAocXVlc3Rpb25NYXJrUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBhd2FpdCBnbG9iYnkocXVlc3Rpb25NYXJrUGF0dGVybnMsIHsgLi4uZ2xvYmJ5T3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpIG1hbmlmZXN0UGF0aFNldC5hZGQobWFuaWZlc3RQYXRoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWFuaWZlc3RQYXRocyA9IFsuLi5tYW5pZmVzdFBhdGhTZXRdO1xuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocHJvamVjdC5kaXJQYXRoKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBtYW5pZmVzdFBhdGhzXG4gICAgLy8gQSBgKipgIHBhdHRlcm4gcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCBhbmQgaW5zdGFsbGVkIHBhY2thZ2VzLCBidXQgbmVpdGhlciBpcyBhXG4gICAgLy8gd29ya3NwYWNlIHRvIFlhcm4gKHdoaWNoIG5ldmVyIGRlc2NlbmRzIGludG8gbm9kZV9tb2R1bGVzKS5cbiAgICAuZmlsdGVyKChtYW5pZmVzdFBhdGgpID0+IHtcbiAgICAgIGlmIChtYW5pZmVzdFBhdGggPT09ICdwYWNrYWdlLmpzb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1hbmlmZXN0UGF0aCkpKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgbWFuaWZlc3QgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGw6IG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pXG4gICAgLm1hcCgobWFuaWZlc3RQYXRoKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUobWFuaWZlc3RQYXRoKSkpO1xuICByZXR1cm4gWy4uLm5ldyBTZXQod29ya3NwYWNlRGlyUGF0aHMpXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIC5naXRpZ25vcmUgY2FycmllcyB3YmZ5J3MgbWFuYWdlZCBydWxlIGZvciB0aGUgZmlsZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGBnaXQgY2hlY2staWdub3JlYDogdGhhdCBhbHNvIGhvbm9ycyBgLmdpdC9pbmZvL2V4Y2x1ZGVgIGFuZCB0aGUgdXNlcidzIGdsb2JhbFxuICogZXhjbHVkZXMsIHdoaWNoIGEgZnJlc2ggY2xvbmUgYW5kIENJIGRvIG5vdCBoYXZlLiBBIGRldmVsb3BlciB3aXRoIGEgcGVyc29uYWxcbiAqIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBleGNsdWRlIHdvdWxkIG90aGVyd2lzZSB0dXJuIGdlbmVyYXRpb24gb24gZm9yIGEgcGFja2FnZSB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0aGUgcmVzdWx0aW5nIGZpbGUgd291bGQgYmUgaW52aXNpYmxlIGluIGBnaXQgc3RhdHVzYC5cbiAqIGBwYWNrYWdlcy93YmZ5L3NyYy9maXhlcnMvd29ya2VyVHlwZXMudHNgIGdhdGVzIG9uIHRoZSBzYW1lIGNvbW1pdHRlZCBydWxlLlxuICovXG5mdW5jdGlvbiBoYXNNYW5hZ2VkR2l0aWdub3JlUnVsZShkaXJQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0aWdub3JlJyksICd1dGY4JylcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKSA9PT0gYC8ke2ZpbGVOYW1lfWApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcGFja2FnZSBzY3JpcHQgcnVucyBhIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCB3b3VsZCB3cml0ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSBiYXJlXG4gKiBpbnZvY2F0aW9uIHdyaXRlcy4gYC0tY2hlY2tgL2AtLWhlbHBgIHZhbGlkYXRlIG9yIHByaW50IGFuZCB3cml0ZSBub3RoaW5nLCBzbyB0aGV5IGRvIG5vdCBjb3VudC4gYC0tZW52LWZpbGVgXG4gKiBuZXZlciBjb3VudHM6IGB3YiBnZW4tY29kZWAgc3VwcGxpZXMgaXRzIG93biBgLS1lbnYtZmlsZWAgc3R1YiBmcm9tIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCB3aGljaCByZXBsYWNlc1xuICogdGhlIGRvdGVudiBpbmZlcmVuY2UgY2Fub25pY2FsbHksIHNvIGFuIGVudi1maWxlLW9ubHkgaW52b2NhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb25cbiAqIHdoZXRoZXIgb3Igbm90IHRoZSBuYW1lZCBmaWxlcyBleGlzdCBvbiB0aGlzIG1hY2hpbmUg4oCUIGFuZCB0ZXN0aW5nIGxvY2FsIGV4aXN0ZW5jZSB3b3VsZCBtYWtlIHRoaXMgcHJlZGljYXRlXG4gKiBkaXNhZ3JlZSBhY3Jvc3MgbWFjaGluZXMuIE1pcnJvcnMgd2JmeSdzIGBoYXNDdXN0b21XcmFuZ2xlclR5cGVzSW52b2NhdGlvbmA7IHRoZSB0d28gbXVzdCBhZ3JlZSwgc2luY2Ugd2JmeSdzXG4gKiBhbnN3ZXIgZGVjaWRlcyB0aGUgZ2l0aWdub3JlIHJ1bGUgdGhpcyBwcmVkaWNhdGUga2V5cyBvbi5cbiAqL1xuZnVuY3Rpb24gaGFzT3V0cHV0Q2hhbmdpbmdXcmFuZ2xlclR5cGVzKHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1BhdHRlcm4gPSAvKD86XnxcXHMpd3JhbmdsZXJcXHMrdHlwZXMoPzpcXHN8JCkvdTtcbiAgY29uc3QgZW52RmlsZU9ubHlQYXR0ZXJuID0gL14oPzooPzpidW54fG5weClcXHMrfCg/Onlhcm58cG5wbSlcXHMrZGx4XFxzKyk/d3JhbmdsZXJcXHMrdHlwZXMoPzpcXHMrLS1lbnYtZmlsZVxccytcXFMrKSokL3U7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4ge1xuICAgIGlmICghc2NyaXB0IHx8ICF3cmFuZ2xlclR5cGVzUGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVja2VkIG9uIHRoZSBXSE9MRSBzY3JpcHQsIGJlZm9yZSBzcGxpdHRpbmc6IGBjZCBzdWIgJiYgd3JhbmdsZXIgdHlwZXNgIHJ1bnMgdGhlIGdlbmVyYXRvciBpbiBhbm90aGVyXG4gICAgLy8gZGlyZWN0b3J5IGFnYWluc3QgYW5vdGhlciBjb25maWcsIGJ1dCBpdHMgc2Vjb25kIHNlZ21lbnQgYWxvbmUgbG9va3MgbGlrZSBhIHBsYWluIGludm9jYXRpb24uIHdiZnlcbiAgICAvLyBjbGFzc2lmaWVzIGFueSBzY3JpcHQgY2FycnlpbmcgdGhpcyBzeW50YXggYXMgY3VzdG9tLCBhbmQgdGhlIHR3byBwcmVkaWNhdGVzIG11c3QgYWdyZWUuXG4gICAgaWYgKC9bO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3UudGVzdChzY3JpcHQpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gc2NyaXB0XG4gICAgICAuc3BsaXQoJyYmJylcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpXG4gICAgICAuc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKC8oPzpefFxccykoPzotLWhlbHB8LWgpKD86XFxzfD18JCkvdS50ZXN0KHNlZ21lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUiBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gaXQgaXMgb25seSBoYXJtbGVzcyB3aGVuIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAvLyBpbnZvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJhcmUgb25lLlxuICAgICAgICBjb25zdCB3aXRob3V0Q2hlY2sgPSBzZWdtZW50XG4gICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxzKS0tY2hlY2soPzpcXHN8PXwkKS91LCAnICcpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB3aXRob3V0Q2hlY2sgPT09IHNlZ21lbnQgPyBzZWdtZW50IDogd2l0aG91dENoZWNrO1xuICAgICAgICAvLyBOb3QgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBpbnZvY2F0aW9uLCB3aXRoIG9yIHdpdGhvdXQgYC0tY2hlY2tgOiBgLS1jaGVja2AgY29tcGFyZXMgdGhlIHJlc3VsdCBGT1JcbiAgICAgICAgLy8gVEhFIFNVUFBMSUVEIE9QVElPTlMsIHNvIGAtLWNoZWNrIC0tc3RyaWN0LXZhcnM9ZmFsc2VgIHN0aWxsIGRlc2NyaWJlcyBhIGRpZmZlcmVudCBmaWxlLlxuICAgICAgICByZXR1cm4gIWVudkZpbGVPbmx5UGF0dGVybi50ZXN0KGNhbmRpZGF0ZSk7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gcmVzb2x2aW5nIEhFQUQgd291bGQgZmFpbC5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpID8gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YsIGNvbW1pdEhhc2gpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuLyoqIFRoZSBIRUFEIGNvbW1pdCBoYXNoLCBvciB1bmRlZmluZWQgb24gYW4gdW5ib3JuIEhFQUQgKGEgcmVwbyB3aXRob3V0IGNvbW1pdHMpLiAqL1xuZnVuY3Rpb24gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID09PSAwID8gcmV0LnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgY29tbWl0SGFzaDogc3RyaW5nXG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICAvLyBUaGUgaW52b2tlZCBidWlsZCBjb21tYW5kIGlzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5OiBgLWMgY29tbWFuZEJgIG11c3Qgbm90IHJldXNlIGFcbiAgLy8gY2FjaGUgcmVjb3JkZWQgZm9yIGNvbW1hbmRBIHdpdGggb3RoZXJ3aXNlIHVuY2hhbmdlZCBpbnB1dHMuXG4gIGhhc2gudXBkYXRlKGFyZ3YuY29tbWFuZCA/PyAnJyk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIGNvbnN0IGNhY2hlID0gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQpO1xuICBpZiAoY2FjaGU/Lmhhc2ggIT09IGNvbnRlbnRIYXNoKSByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG5cbiAgLy8gVGhlIGNhY2hlIGlzIHZhbGlkIG9ubHkgd2hpbGUgdGhlIHJlY29yZGVkIChvciBleHBsaWNpdGx5IHJlcXVlc3RlZCkgYnVpbGQgb3V0cHV0cyBzdGlsbFxuICAvLyBleGlzdDogYSBkZWxldGVkIG91dHB1dCBkaXJlY3RvcnkgKGUuZy4gYHJtIC1yZiBkaXN0YCkgbXVzdCB0cmlnZ2VyIGEgcmVidWlsZCBldmVuIHdoZW4gdGhlXG4gIC8vIGlucHV0cyBhcmUgdW5jaGFuZ2VkIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85ODEpLlxuICBjb25zdCByZXF1aXJlZE91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBjYWNoZS5vdXRwdXRQYXRocztcbiAgY29uc3QgbWlzc2luZ091dHB1dFBhdGhzID0gcmVxdWlyZWRPdXRwdXRQYXRocy5maWx0ZXIoXG4gICAgKG91dHB1dFBhdGgpID0+ICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKVxuICApO1xuICBpZiAobWlzc2luZ091dHB1dFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBSZWJ1aWxkaW5nIGJlY2F1c2UgYnVpbGQgb3V0cHV0cyBhcmUgbWlzc2luZzogJHttaXNzaW5nT3V0cHV0UGF0aHMuam9pbignLCAnKX1gKSk7XG4gICAgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBoYXNoOiBzdHJpbmc7IG91dHB1dFBhdGhzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWRDb250ZW50KSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZWRDb250ZW50KSBhcyB7IGhhc2g/OiB1bmtub3duOyBvdXRwdXRQYXRocz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHBhcnNlZD8uaGFzaCAhPT0gJ3N0cmluZycpIHJldHVybjtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLm91dHB1dFBhdGhzKVxuICAgICAgPyBwYXJzZWQub3V0cHV0UGF0aHMuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiB7IGhhc2g6IHBhcnNlZC5oYXNoLCBvdXRwdXRQYXRocyB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxlZ2FjeSBjYWNoZSBmaWxlIGNvbnRhaW5zIGEgcmF3IGNvbnRlbnQgaGFzaCB3aXRob3V0IG91dHB1dCByZWNvcmRzLiBUcmVhdCBpdCBhcyBhIG1pc3M6XG4gICAgLy8gaG9ub3JpbmcgaXQgd291bGQgbGV0IGEgbWF0Y2hpbmcgaGFzaCBza2lwIGEgYnVpbGQgd2hvc2Ugb3V0cHV0cyB3ZXJlIGRlbGV0ZWQsIGFuZCBvbmVcbiAgICAvLyByZWJ1aWxkIHVwZ3JhZGVzIHRoZSByZWNvcmQgdG8gdGhlIEpTT04gZm9ybWF0LlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBNYXRjaGVkIGFzIGNvbXBsZXRlIHBhdGggU0VHTUVOVFMgKG5vdCBzdWJzdHJpbmdzKTogYHNyYy9jb250ZXN0L2AgbXVzdCBub3QgYmUgZXhjbHVkZWQgYnlcbi8vIGB0ZXN0YCwgYW5kIGBteXNyYy9gIG11c3Qgbm90IGJlIGluY2x1ZGVkIGJ5IGBzcmNgLlxuY29uc3QgaW5jbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3NyYycsICdwdWJsaWMnXSk7XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG4gICdidW4ubG9jaycsXG4gICdidW4ubG9ja2InLFxuXTtcbmNvbnN0IGV4Y2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWyd0ZXN0JywgJ3Rlc3RzJywgJ19fdGVzdHNfXycsICd0ZXN0LWZpeHR1cmVzJ10pO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyBgLXVhbGxgIGxpc3RzIHVudHJhY2tlZCBmaWxlcyBpbmRpdmlkdWFsbHkgKG5vdCBqdXN0IHRoZWlyIGRpcmVjdG9yeSksIHNvIG5ldyBmaWxlcyBpbiBhXG4gICAgLy8gYnJhbmQtbmV3IHNvdXJjZSBkaXJlY3RvcnkgcGFydGljaXBhdGUgaW4gdGhlIGhhc2ggYmVsb3cuIGAtemAgeWllbGRzIE5VTC1kZWxpbWl0ZWQsXG4gICAgLy8gVU5RVU9URUQgcmVjb3Jkczogd2l0aG91dCBpdCBnaXQgQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzLCB3aGljaCB3b3VsZCBzaWxlbnRseSBkcm9wIHRob3NlXG4gICAgLy8gZmlsZXMgZnJvbSBib3RoIHRoZSB1bnRyYWNrZWQgaGFzaGluZyBhbmQgdGhlIGBnaXQgZGlmZmAgcGF0aHNwZWNzLlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctdWFsbCcsICcteiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnMgPSByZXQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBzdGF0dXNFbnRyaWVzOiB7IHVudHJhY2tlZDogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRva2VuLnNsaWNlKDAsIDIpO1xuICAgICAgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBzdGF0dXMgPT09ICc/PycsIGZpbGVQYXRoOiB0b2tlbi5zbGljZSgzKSB9KTtcbiAgICAgIC8vIFJlbmFtZS9jb3B5IHJlY29yZHMgY2FycnkgdGhlIE9SSUdJTkFMIHBhdGggYXMgYW4gZXh0cmEgTlVMLWRlbGltaXRlZCBmaWVsZDsgaW5jbHVkZSBpdFxuICAgICAgLy8gc28gYSBmaWxlIHJlbmFtZWQgb3V0IG9mIHRoZSBidWlsZCBpbnB1dHMgc3RpbGwgaW52YWxpZGF0ZXMgdGhlIGNhY2hlLlxuICAgICAgaWYgKHN0YXR1cy5pbmNsdWRlcygnUicpIHx8IHN0YXR1cy5pbmNsdWRlcygnQycpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHRva2Vuc1srK2luZGV4XTtcbiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBmYWxzZSwgZmlsZVBhdGg6IG9yaWdpbmFsUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXMgPSBzdGF0dXNFbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGhhc2hQYXRoOlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0J1xuICAgICAgICAgID8gZW50cnkuZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpXG4gICAgICAgICAgOiBlbnRyeS5maWxlUGF0aCxcbiAgICB9KSk7XG4gICAgLy8gQnVpbGQgT1VUUFVUUyBtdXN0IG5ldmVyIGNvdW50IGFzIGJ1aWxkIGlucHV0czogaGFzaGluZyBlLmcuIGFuIHVudHJhY2tlZCBkaXN0LyBmaWxlIHdvdWxkXG4gICAgLy8gY2hhbmdlIHRoZSBoYXNoIG9uIGV2ZXJ5IGJ1aWxkIGFuZCBkaXNhYmxlIHRoZSBjYWNoZSBwZXJtYW5lbnRseS5cbiAgICBjb25zdCBwcm9qZWN0UmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgpO1xuICAgIGNvbnN0IGV4cGxpY2l0T3V0cHV0UGF0aHMgPSAoZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBbXSkubWFwKChvdXRwdXRQYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3RSZWxhdGl2ZURpclBhdGgsIG91dHB1dFBhdGgpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBub3JtYWxpemVkRW50cmllcy5maWx0ZXIoKHsgZmlsZVBhdGgsIGhhc2hQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeVNlZ21lbnRzID0gaGFzaFBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAtMSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaW5jbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gaGFzaFBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBleGNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSAmJlxuICAgICAgICAvLyBPbmx5IEVYUExJQ0lUTFkgZGVjbGFyZWQgb3V0cHV0cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXQgaGFzaC4gRGVmYXVsdCBjYW5kaWRhdGVzXG4gICAgICAgIC8vIChkaXN0L2J1aWxkLy5uZXh0L291dCkgYXJlIE5PVDogZ2l0aWdub3JlZCBhcnRpZmFjdHMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgc3RhdHVzYFxuICAgICAgICAvLyBhbnl3YXksIGFuZCBhIG5vbi1pZ25vcmVkIGZpbGUgdGhlcmUgbWF5IGJlIGdlbnVpbmUgc291cmNlIChlLmcuIGJ1aWxkLyBzY3JpcHRzKSwgd2hvc2VcbiAgICAgICAgLy8gY2hhbmdlcyBtdXN0IGludmFsaWRhdGUgdGhlIGNhY2hlIOKAlCBjb3JyZWN0bmVzcyBvdmVyIGNhY2hlIGhpdHMuIFByb2plY3RzIGtlZXBpbmdcbiAgICAgICAgLy8gbm9uLWlnbm9yZWQgYXJ0aWZhY3RzIGluIHRob3NlIGRpcmVjdG9yaWVzIHNob3VsZCBnaXRpZ25vcmUgdGhlbSBvciBwYXNzIC0tb3V0cHV0LlxuICAgICAgICAhbWF0Y2hlc091dHB1dFBhdGgoZXhwbGljaXRPdXRwdXRQYXRocywgZmlsZVBhdGgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVW50cmFja2VkIGZpbGVzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IGRpZmZgLCBzbyBoYXNoIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LlxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnVudHJhY2tlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lmhhc2hQYXRoKTtcbiAgICAgICAgaGFzaC51cGRhdGUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCBlbnRyeS5maWxlUGF0aCkpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZmlsZSBtYXkgdmFuaXNoIGNvbmN1cnJlbnRseTsgdGhlIHRyYWNrZWQtc3RhdGUgZGlmZiBiZWxvdyBpcyB1bmFmZmVjdGVkLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrZWRQYXRocyA9IGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkudW50cmFja2VkKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCk7XG4gICAgaWYgKHRyYWNrZWRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGBnaXQgZGlmZiBIRUFEIC0tYCB3aXRoIG5vIHBhdGhzcGVjIHdvdWxkIGRpZmYgRVZFUlkgZmlsZSwgbGV0dGluZyBleGNsdWRlZCBjaGFuZ2VzXG4gICAgICAvLyAoZG9jcywgdGVzdHMpIGludmFsaWRhdGUgdGhlIGNhY2hlLlxuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgZ2l0IGRpZmYgSEVBRGAgKG5vdCBwbGFpbiBgZ2l0IGRpZmZgKSBzbyBzdGFnZWQtb25seSBjaGFuZ2VzIGludmFsaWRhdGUgdGhlIGNhY2hlIHRvbztcbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGguXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICdIRUFEJywgJy0tJywgLi4udHJhY2tlZFBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgb21pdFNpbGVudFN0YXJ0PzogYm9vbGVhbjtcbiAgcHJlc2VydmVDb2xvcj86IGJvb2xlYW47XG4gIHByb2Nlc3NTaWxlbnRPdXRwdXQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuO1xuICBwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHk/OiBib29sZWFuO1xuICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM/OiBudW1iZXI7XG4gIHNpbGVudFN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJlZFJ1blJlc3VsdCB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIG91dHB1dDogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7IHNpbGVudD86IGJvb2xlYW4gfSxcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIGlmICghKGFyZ3Yuc2lsZW50ICYmIG9wdHMub21pdFNpbGVudFN0YXJ0ICYmICFhcmd2LmRyeVJ1bikpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCBhcmd2LnNpbGVudCA/ICdDb21tYW5kJyA6ICdTdGFydCcpO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ID0gQm9vbGVhbihcbiAgICBhcmd2LnNpbGVudCAmJiAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8/IG9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5KVxuICApO1xuICBsZXQgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IGZhbHNlO1xuICBjb25zdCBwcm9ncmVzc1RpbWVyID1cbiAgICBhcmd2LnNpbGVudCAmJiBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNc1xuICAgICAgPyBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4nKTtcbiAgICAgICAgICB3cm90ZVNpbGVudFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSwgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gKGFyZ3Yuc2lsZW50ID8gdHJ1ZSA6IHVuZGVmaW5lZCkgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IGFyZ3Yuc2lsZW50ID8gJ3BpcGUnIDogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBtZXJnZU91dEFuZEVycm9yOiBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc6IGFyZ3Yuc2lsZW50LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKHByb2dyZXNzVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICh3cm90ZVNpbGVudFByb2dyZXNzKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG4gIGlmIChzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ICYmICghb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkgfHwgZXhpdENvZGUgIT09IDApKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/IG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dChyZXQuc3Rkb3V0KSA6IHJldC5zdGRvdXQpLnRyaW0oKTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgfVxuICBpZiAoYXJndi5zaWxlbnQgJiYgZXhpdENvZGUgPT09IDAgJiYgb3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSk7XG4gIH1cbiAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBleGl0Q29kZSwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHJldHVybiB7XG4gICAgICBleGl0Q29kZTogcmV0LnN0YXR1cyA/PyAxLFxuICAgICAgb3V0cHV0OiByZXQuc3Rkb3V0LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHMgcmVxdWlyaW5nXG4gIC8vIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoL1BSSVNNQSBnZW5lcmF0ZSg/IVxccystLW5vLWhpbnRzKSg/PVxcc3wkKS9ndSwgJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzJylcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsICdZQVJOIHByaXNtYSAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOIHJ1biAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuKSBydW5gLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAneWFybiBydW4gJyk7XG4gIGlmIChwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biBydW4gYnVuIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgY29uc3QgcHJpbnRhYmxlU2NyaXB0ID0gbmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgLy8gS2VlcCBQbGF5d3JpZ2h0IGFzIGEgcGFja2FnZS1tYW5hZ2VyIGNvbW1hbmQgaW5zdGVhZCBvZiByZXNvbHZpbmcgaXQgdGhyb3VnaCBub2RlX21vZHVsZXMvLmJpbi5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52IC0tICR7cHJpbnRhYmxlU2NyaXB0fWAsXG4gICAgcnVubmFibGU6IHJ1bm5hYmxlU2NyaXB0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+LFxuICBwcmludE9wdGlvbnM6IHsgc2lsZW50U3VjY2Vzcz86IGJvb2xlYW4gfSA9IHt9XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgaWYgKHByaW50T3B0aW9ucy5zaWxlbnRTdWNjZXNzKSByZXR1cm47XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudihcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRzOiBPcHRpb25zXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgY29uZmlndXJlQ29sb3JFbnYobmV3RW52LCBvcHRzLnByZXNlcnZlQ29sb3IpO1xuICByZXR1cm4gbmV3RW52O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgY2hpbGQtcHJvY2VzcyBjb2xvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHdiLW1hbmFnZWQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSBlbnYgVGhlIGNoaWxkLXByb2Nlc3MgZW52aXJvbm1lbnQgdG8gbXV0YXRlLlxuICogQHBhcmFtIHByZXNlcnZlQ29sb3IgV2hldGhlciB3YiBzaG91bGQgcHJlc2VydmUgY29sb3JzIGZvciBvdXRwdXQgdGhhdCBpdCBjYXB0dXJlcyBhbmQgcmVwcmludHMgdG8gYW4gaW50ZXJhY3RpdmUgVFRZLlxuICovXG5mdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgY2hlY2tFbnZCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBjaGVja0VudkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGNoZWNrRW52QnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjaGVjay1lbnYnLFxuICBkZXNjcmliZTpcbiAgICAnVmVyaWZ5IHRoYXQgZXZlcnkgZm5veC1kZWNsYXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgc2VjcmV0IHJlc29sdmVzIGZvciB0aGUgY3VycmVudCBXQl9FTlYuIFByZWZpeCBzY3JpcHRzIHRoYXQgd3JpdGUgdG8gcmVtb3RlIGVudmlyb25tZW50cyB3aXRoIHRoaXMgY29tbWFuZCB0byBmYWlsIGZhc3Qgb24gbWlzc2luZyBzZWNyZXRzLicsXG4gIGJ1aWxkZXI6IGNoZWNrRW52QnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgY2hlY2tFbnYoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tFbnYoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjaGVja0VudkJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgIGNvbnNvbGUuaW5mbygnTm8gZm5veC50b21sIGZvdW5kOyBub3RoaW5nIHRvIGNoZWNrLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlYWRpbmcgcHJvamVjdC5lbnYgcmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyBXQl9FTlYgKGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiksIHNvIHRoZSBwcm9maWxlXG4gIC8vIGJlbG93IGlzIHRoZSBzYW1lIG9uZSBldmVyeSBvdGhlciB3YiBjb21tYW5kIHdvdWxkIGxvYWQuXG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50JztcbiAgLy8gYC0taWYtbWlzc2luZyBlcnJvcmAgbWFrZXMgdW5yZXNvbHZhYmxlIHNlY3JldHMgKGUuZy4gYSBtaXNzaW5nIGFnZSBpZGVudGl0eSkgYSBoYXJkIGZhaWx1cmUsXG4gIC8vIHVubGlrZSB0aGUgdG9sZXJhbnQgZGVmYXVsdCB1c2VkIGZvciBvcmRpbmFyeSBlbnYgbG9hZGluZy5cbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYGZub3ggZXhwb3J0IC0tYWxsIC0tZm9ybWF0IGpzb24gLS1uby1kYWVtb24gLS1pZi1taXNzaW5nIGVycm9yIC0tcHJvZmlsZSAke3Byb2ZpbGV9ID4gL2Rldi9udWxsYCxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byByZXNvbHZlIGZub3gtZGVjbGFyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBwcm9maWxlIFwiJHtwcm9maWxlfVwiLmApKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgQWxsIGZub3gtZGVjbGFyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlc29sdmUgZm9yIHByb2ZpbGUgXCIke3Byb2ZpbGV9XCIuYCk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSA9ICdsaXRlc3RyZWFtLnltbCc7XG5jb25zdCBERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWdQYXRoKSByZXR1cm4gYC1jb25maWcgXCIke2NvbmZpZ1BhdGh9XCJgO1xuXG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQ29uZmlnUGF0aCkpIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG4gIGlmIChmcy5leGlzdHNTeW5jKERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCkpIHJldHVybiBgLWNvbmZpZyAke0RFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSH1gO1xuICByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZCwgZ2V0RDFEYXRhYmFzZU5hbWUsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpciB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB7IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24gfSBmcm9tICcuL2xpdGVzdHJlYW0uanMnO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdjbGVhbnVwLWxpdGVzdHJlYW0nKTtcbiAgICBjb25zdCB3YWxDaGVja3BvaW50Q29tbWFuZCA9IGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXSAmJiBjb21tYW5kIC12IHNxbGl0ZTMgPi9kZXYvbnVsbDsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IHNxbGl0ZTMgXCIke2RiUGF0aH1cIjsgZmlgO1xuICAgIHJldHVybiBgJHt3YWxDaGVja3BvaW50Q29tbWFuZH07IHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSo7IHJtIC1SZiBcIiR7cGF0aC5kaXJuYW1lKGRiUGF0aCl9Ly4ke3BhdGguYmFzZW5hbWUoZGJQYXRoKX1cIiogfHwgdHJ1ZWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkMURhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICAgIGlmIChkMURhdGFiYXNlTmFtZSkge1xuICAgICAgLy8gUmVtb3ZlIG9ubHkgdGhlIEQxIHN1YnRyZWUgc28gdGhhdCBvdGhlciBsb2NhbGx5LXBlcnNpc3RlZCBiaW5kaW5ncyAoS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpIHN1cnZpdmUsXG4gICAgICAvLyB0aGVuIHJlLW1hdGVyaWFsaXplIHRoZSBEMSBTUUxpdGUgZmlsZS4gSXRzIHBhdGggaXMgZGV0ZXJtaW5pc3RpYywgc28gYSBEQVRBQkFTRV9VUkwgZXhwb3J0ZWRcbiAgICAgIC8vIGJlZm9yZSB0aGUgcmVtb3ZhbCBzdGF5cyB2YWxpZC5cbiAgICAgIHJldHVybiBgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9L3YzL2QxXCIgJiYgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZDFEYXRhYmFzZU5hbWUpfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3JlbW92ZUNvbW1hbmR9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWVkQ29tbWFuZCA9IHRoaXMuc2VlZChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRlQ29tbWFuZCA9IHRoaXMuZGVwbG95KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICByZXR1cm4gc2VlZENvbW1hbmQgPT09ICd0cnVlJyA/IG1pZ3JhdGVDb21tYW5kIDogYCR7bWlncmF0ZUNvbW1hbmR9ICYmICR7c2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIG1pZ3JhdGVGb3JTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiAoYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCkgfHwgZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgZGVwbG95KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2RlcGxveS1mb3JjZScpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gVGhlIGVudmlyb25tZW50IGFzc2lnbm1lbnQgbXVzdCBnbyB0aHJvdWdoIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQ6IHByZWZpeGluZyBpdHNcbiAgICAvLyBwb3NzaWJseS1wYXJlbnRoZXNpemVkIHJlc3VsdCB3aXRoIGBBTExPV19UT19TS0lQX1NFRUQ9MGAgd291bGQgYmUgYSBzaGVsbCBzeW50YXggZXJyb3IuXG4gICAgY29uc3QgbWlncmF0ZVdpdGhTZWVkQ29tbWFuZCA9IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgJ21pZ3JhdGUnLCAnQUxMT1dfVE9fU0tJUF9TRUVEPTAnKTtcbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgJHt0aGlzLmRlcGxveShwcm9qZWN0KX0gJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9XCIgJiYgbHMgLWFobCBcIiR7ZGJQYXRofVwiICYmICR7bWlncmF0ZVdpdGhTZWVkQ29tbWFuZH1gO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2xpc3QtYmFja3VwcycpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAncmVzdG9yZScpO1xuICAgIHJldHVybiBgJHtidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgob3V0cHV0UGF0aCl9OyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyBcIiR7b3V0cHV0UGF0aH1cIiBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIGdlbmVyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgY29uc3QgZGVmYXVsdFNlZWRQYXRoID0gcGF0aC5qb2luKCdkYicsICdzZWVkLnRzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGVmYXVsdFNlZWRQYXRoKSkpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGBCVU4gJHtkZWZhdWx0U2VlZFBhdGh9YCA6IGBCVU4gYnVpbGQtdHMgcnVuICR7ZGVmYXVsdFNlZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3M6IHN0cmluZywgZW52aXJvbm1lbnRBc3NpZ25tZW50ID0gJycpOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kID0gYCR7ZW52aXJvbm1lbnRBc3NpZ25tZW50ICYmIGAke2Vudmlyb25tZW50QXNzaWdubWVudH0gYH1ZQVJOIGRyaXp6bGUta2l0ICR7YXJnc31gO1xuICAvLyBBIGNhbGxlci1zdXBwbGllZCAtLWNvbmZpZyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgc28gdGhlIGN3ZCBtdXN0IHN0YXkgdGhlcmUuXG4gIHJldHVybiBhcmdzLmluY2x1ZGVzKCctLWNvbmZpZycpID8gY29tbWFuZCA6IHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0LCBjb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgLy8gZHJpenpsZS1raXQgcmVzb2x2ZXMgcmVsYXRpdmUgcGF0aHMgaW4gaXRzIGNvbmZpZyBhZ2FpbnN0IHRoZSBjd2QsIHNvIHRoZSBjb21tYW5kIG11c3QgcnVuXG4gIC8vIGluIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBkcml6emxlLmNvbmZpZy4qIGV2ZW4gd2hlbiBtb25vcmVwbyBwYWNrYWdlcyBzaGFyZSBpdCBhdCB0aGUgcm9vdC5cbiAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcuZGlyUGF0aCAhPT0gcHJvamVjdC5kaXJQYXRoXG4gICAgPyBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIGNvbmZpZy5kaXJQYXRoXSl9ICYmICR7Y29tbWFuZH0pYFxuICAgIDogY29tbWFuZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRyaXp6bGUta2l0IGlzIHRoZSBwcm9qZWN0J3MgRDEgbWlncmF0aW9uIG1lY2hhbmlzbS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGlzXG4gKiBub3QgYSByZWxpYWJsZSBtYXJrZXI6IGEgV29ya2VyIG1heSB1c2UgRDEgb25seSBmb3IgY2FjaGluZyB3aGlsZSBpdHMgZHJpenpsZSBjb25maWcgdGFyZ2V0cyBhblxuICogdW5yZWxhdGVkIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpLCBhbmQgcnVubmluZyBgZHJpenpsZS1raXQgbWlncmF0ZWAgYWdhaW5zdFxuICogdGhhdCBkYXRhYmFzZSBkdXJpbmcgYSBEMSBkZXBsb3kgd291bGQgYmUgd3JvbmcgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk0MikuXG4gKiBTbyByZXF1aXJlIGFuIGV4cGxpY2l0IG1hcmtlcjogYSBkcml6emxlIGNvbmZpZyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSwgZDEtaHR0cCwgb3JcbiAqIGR1cmFibGUtc3FsaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIGlmICghcHJvamVjdC5oYXNEcml6emxlKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gc3RyaXBKc0NvbW1lbnRzKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGNvbmZpZy5maWxlTmFtZSksICd1dGY4JykpO1xuICAgIC8vIFNjYW4gb25seSB0aGUgZXhwb3J0ZWQgY29uZmlnJ3Mgb2JqZWN0IGxpdGVyYWw6IGRyaXp6bGUta2l0IGNvbnN1bWVzIHRoZSBkZWZhdWx0IGV4cG9ydCxcbiAgICAvLyBhbmQgbWF0Y2hpbmcgb3RoZXIgdGV4dCAoYW4gdW51c2VkIHNxbGl0ZS1zaGFwZWQgY29uc3RhbnQgYWJvdmUgdGhlIGV4cG9ydCwgb3IgbWFya2VyLWxpa2VcbiAgICAvLyBzdHJpbmcgY29udGVudCBpbiBzdGF0ZW1lbnRzIGFmdGVyIGl0KSB3b3VsZCBzZWxlY3QgdGhlIHdyb25nIG1pZ3JhdGlvbiBtZWNoYW5pc20uXG4gICAgLy8gUE9TSVRJT05TIChleHBvcnQgbWFya2VycywgZGVjbGFyYXRpb25zKSBhcmUgbG9jYXRlZCBvbiBhIHN0cmluZy1tYXNrZWQgdmlldyBvZiB0aGUgc2FtZVxuICAgIC8vIGxlbmd0aCwgc28gYGV4cG9ydCBkZWZhdWx0YCBpbnNpZGUgYSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgbWlzbGVhZCB0aGUgc2VhcmNoLlxuICAgIGNvbnN0IG1hc2tlZENvbnRlbnQgPSBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudCk7XG4gICAgY29uc3QgZXhwb3J0SW5kaWNlcyA9IFsnZXhwb3J0IGRlZmF1bHQnLCAnbW9kdWxlLmV4cG9ydHMnXVxuICAgICAgLm1hcCgobWFya2VyKSA9PiBtYXNrZWRDb250ZW50LmluZGV4T2YobWFya2VyKSlcbiAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCAhPT0gLTEpO1xuICAgIGNvbnN0IGV4cG9ydFN0YXJ0SW5kZXggPSBleHBvcnRJbmRpY2VzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi5leHBvcnRJbmRpY2VzKSA6IDA7XG4gICAgY29uc3Qgb2JqZWN0U3BhbiA9IGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChjb250ZW50LCBtYXNrZWRDb250ZW50LCBleHBvcnRTdGFydEluZGV4KTtcbiAgICByZXR1cm4gb2JqZWN0U3BhbiAhPT0gdW5kZWZpbmVkICYmIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KG9iamVjdFNwYW4pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgb2JqZWN0IGxpdGVyYWwgdGhlIGV4cG9ydCBhY3R1YWxseSBldmFsdWF0ZXMgdG86IGZvciBgZXhwb3J0IGRlZmF1bHQgey4uLn1gIG9yXG4gKiBgZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsuLi59KWAgdGhlIGZpcnN0IGJhbGFuY2VkIG9iamVjdCBhZnRlciB0aGUgbWFya2VyLCBhbmQgZm9yXG4gKiBgZXhwb3J0IGRlZmF1bHQgY29uZmlnO2AgdGhlIGluaXRpYWxpemVyIG9mIHRoYXQgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIOKAlCBuZXZlciB0aGUgd2hvbGVcbiAqIGZpbGUsIHNpbmNlIGFuIHVucmVsYXRlZCBvYmplY3QgKGUuZy4gYW4gdW51c2VkIHNxbGl0ZS1zaGFwZWQgY29uc3RhbnQpIG11c3Qgbm90IGJlIHNlbGVjdGVkLlxuICogVW5kZWZpbmVkIHdoZW4gdGhlIGV4cHJlc3Npb24gY2Fubm90IGJlIHJlc29sdmVkOyB3YiBkZXBsb3kncyB1bm1hbmFnZWQtRDEgd2FybmluZyBjb3ZlcnMgdGhhdC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4cG9ydGVkQ29uZmlnT2JqZWN0KFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG1hc2tlZENvbnRlbnQ6IHN0cmluZyxcbiAgZXhwb3J0U3RhcnRJbmRleDogbnVtYmVyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBleHBvcnRlZEV4cHJlc3Npb24gPSBtYXNrZWRDb250ZW50XG4gICAgLnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXgpXG4gICAgLnJlcGxhY2UoL14oPzpleHBvcnRcXHMrZGVmYXVsdHxtb2R1bGVcXC5leHBvcnRzXFxzKj0pXFxzKi8sICcnKTtcbiAgLy8gQW4gaWRlbnRpZmllciBleHBvcnQgbWF5IGNhcnJ5IGEgVHlwZVNjcmlwdCB0eXBlIHBvc3RmaXggKGBjb25maWcgc2F0aXNmaWVzIENvbmZpZztgIC9cbiAgLy8gYGNvbmZpZyBhcyBDb25maWc7YCk7IHRoZSBpZGVudGlmaWVyIGlzIHJlY29nbml6ZWQgRklSU1Qgc28gYSBwb3N0Zml4IGNvbnRhaW5pbmcgYSBUWVBFXG4gIC8vIGxpdGVyYWwgKGBzYXRpc2ZpZXMgeyBkaWFsZWN0OiAnc3FsaXRlJyB8IC4uLiB9YCkgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSBydW50aW1lIGNvbmZpZy5cbiAgY29uc3QgaWRlbnRpZmllck1hdGNoID0gL14oW0EtWmEtel8kXVtcXHckXSopXFxzKig/OnNhdGlzZmllc1xcYnxhc1xcYnw7fFxcbnwkKS8uZXhlYyhleHBvcnRlZEV4cHJlc3Npb24pO1xuICBpZiAoIWlkZW50aWZpZXJNYXRjaCkge1xuICAgIGNvbnN0IGJyYWNlT2Zmc2V0ID0gbWFza2VkQ29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4KS5pbmRleE9mKCd7Jyk7XG4gICAgaWYgKGJyYWNlT2Zmc2V0ID09PSAtMSkgcmV0dXJuO1xuICAgIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXggKyBicmFjZU9mZnNldCkpO1xuICB9XG5cbiAgLy8gYCRgIGlzIGxlZ2FsIGluIGlkZW50aWZpZXJzIGJ1dCBhIHJlZ2V4IGFuY2hvciwgc28gaXQgbXVzdCBiZSBlc2NhcGVkIGJlZm9yZSBpbnRlcnBvbGF0aW9uO1xuICAvLyBgKD8hW1xcdyRdKWAgKG5vdCBgXFxiYCkgZW5kcyB0aGUgbWF0Y2ggYmVjYXVzZSBgXFxiYCBuZXZlciBmaXJlcyBhZnRlciBhIHRyYWlsaW5nIGAkYC5cbiAgY29uc3QgZXNjYXBlZElkZW50aWZpZXIgPSBpZGVudGlmaWVyTWF0Y2hbMV0hLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICBjb25zdCBkZWNsYXJhdGlvbkVuZEluZGV4ID0gZmluZE1vZHVsZVNjb3BlRGVjbGFyYXRpb25FbmQobWFza2VkQ29udGVudCwgZXNjYXBlZElkZW50aWZpZXIpO1xuICBpZiAoZGVjbGFyYXRpb25FbmRJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIC8vIFRoZSBpbml0aWFsaXplciBtdXN0IGJlbG9uZyB0byBUSElTIGRlY2xhcmF0aW9uIChhIHR5cGUgYW5ub3RhdGlvbiBtYXkgcHJlY2VkZSB0aGUgYD1gKTsgYW5cbiAgLy8gdW5pbml0aWFsaXplZCBgbGV0IGNvbmZpZztgIHN0YXlzIHVucmVzb2x2ZWQgaW5zdGVhZCBvZiBncmFiYmluZyBhIGxhdGVyIHN0YXRlbWVudCdzIGA9YC5cbiAgY29uc3QgYXNzaWdubWVudE1hdGNoID0gL15cXHMqKD86OltePTtcXG5dKik/PS8uZXhlYyhtYXNrZWRDb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXgpKTtcbiAgaWYgKCFhc3NpZ25tZW50TWF0Y2gpIHJldHVybjtcbiAgcmV0dXJuIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQuc2xpY2UoZGVjbGFyYXRpb25FbmRJbmRleCArIGFzc2lnbm1lbnRNYXRjaFswXS5sZW5ndGgpKTtcbn1cblxuLyoqXG4gKiBUaGUgZW5kIGluZGV4IG9mIHRoZSBpZGVudGlmaWVyJ3MgZGVjbGFyYXRpb24gYXQgYnJhY2UgZGVwdGggWkVSTyAobW9kdWxlIHNjb3BlKTogYSBzYW1lLW5hbWVkXG4gKiBkZWNsYXJhdGlvbiBpbnNpZGUgYSBmdW5jdGlvbiBib2R5IG11c3Qgbm90IHNoYWRvdyB0aGUgYmluZGluZyB0aGUgZXhwb3J0IHJlZmVyZW5jZXMsIGFuZFxuICogaW5kZW50YXRpb24gaXMgbm8gc2NvcGUgc2lnbmFsIOKAlCBkZXB0aCBvdmVyIHRoZSBzdHJpbmctbWFza2VkIGNvbnRlbnQgaXMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQ6IHN0cmluZywgZXNjYXBlZElkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgKD88IVtcXHckXSkoPzpleHBvcnRcXHMrKT8oPzpjb25zdHxsZXR8dmFyKVxccyske2VzY2FwZWRJZGVudGlmaWVyfSg/IVtcXHckXSlgLFxuICAgICdnJ1xuICApO1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc2NhbkluZGV4ID0gMDtcbiAgZm9yIChsZXQgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCk7IG1hdGNoOyBtYXRjaCA9IGRlY2xhcmF0aW9uUmVnZXguZXhlYyhtYXNrZWRDb250ZW50KSkge1xuICAgIGZvciAoOyBzY2FuSW5kZXggPCBtYXRjaC5pbmRleDsgc2NhbkluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBtYXNrZWRDb250ZW50W3NjYW5JbmRleF07XG4gICAgICBpZiAoY2hhciA9PT0gJ3snKSBkZXB0aCsrO1xuICAgICAgZWxzZSBpZiAoY2hhciA9PT0gJ30nKSBkZXB0aC0tO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVwbGFjZSB0aGUgQ09OVEVOVFMgb2Ygc3RyaW5nIGxpdGVyYWxzIHdpdGggc3BhY2VzIChzYW1lIGxlbmd0aCwgbmV3bGluZXMga2VwdCksIHNvIHBvc2l0aW9uXG4gKiBzZWFyY2hlcyBvdmVyIHRoZSByZXN1bHQgY2Fubm90IG1hdGNoIHRleHQgaW5zaWRlIHN0cmluZ3Mgd2hpbGUgYWxsIGluZGV4ZXMgc3RpbGwgbWFwIDE6MSB0b1xuICogdGhlIG9yaWdpbmFsIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIG1hc2tTdHJpbmdDb250ZW50cyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICAnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyID09PSAnXFxuJyA/ICdcXG4nIDogJyAnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZy1hd2FyZSBzY2FuIGZvciB0aGUgbWFya2VycyBpbmRpY2F0aW5nIHRoZSBjb25maWcgbWFuYWdlcyBhIChDbG91ZGZsYXJlIEQxIGNvbXBhdGlibGUpXG4gKiBTUUxpdGUgZGF0YWJhc2Ug4oCUIGEgYGRpYWxlY3Q6ICdzcWxpdGUnYCwgYGRyaXZlcjogJ2QxLWh0dHAnYCwgb3IgYGRyaXZlcjogJ2R1cmFibGUtc3FsaXRlJ2BcbiAqIFBST1BFUlRZIChwbGFpbiBvciBxdW90ZWQga2V5KS4gS2V5cyBhcmUgb25seSByZWNvZ25pemVkIGluIGNvZGUgcG9zaXRpb24sIHNvIG1hcmtlci1saWtlIHRleHRcbiAqIGVtYmVkZGVkIGluIHVucmVsYXRlZCBzdHJpbmcgdmFsdWVzIChlLmcuIGEgc2NoZW1hIHBhdGgpIGNhbm5vdCBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNTcWxpdGVUYXJnZXQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5ncyhjb250ZW50KTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdmFsdWVUb2tlbkluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbXFxzeywoXSkoZGlhbGVjdHxkcml2ZXIpXFxzKjpcXHMqJC8uZXhlYyh0b2tlbi52YWx1ZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAga2V5ID0gbWF0Y2hbMV07XG4gICAgICAgIHZhbHVlVG9rZW5JbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnZGlhbGVjdCcgfHwgdG9rZW4udmFsdWUgPT09ICdkcml2ZXInKSB7XG4gICAgICAvLyBBIHF1b3RlZCBrZXk6IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRva2VucyBtdXN0IGZvcm0gYSBwcm9wZXJ0eSBwb3NpdGlvbiAoYHtgL2AsYCBiZWZvcmUsXG4gICAgICAvLyBgOmAgYWZ0ZXIpLlxuICAgICAgY29uc3QgcHJldmlvdXNUb2tlbiA9IHRva2Vuc1tpbmRleCAtIDFdO1xuICAgICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW2luZGV4ICsgMV07XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzVG9rZW4/LnR5cGUgPT09ICdjb2RlJyAmJlxuICAgICAgICAvW3ssKF1cXHMqJC8udGVzdChwcmV2aW91c1Rva2VuLnZhbHVlKSAmJlxuICAgICAgICBuZXh0VG9rZW4/LnR5cGUgPT09ICdjb2RlJyAmJlxuICAgICAgICAvXlxccyo6XFxzKiQvLnRlc3QobmV4dFRva2VuLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGtleSA9IHRva2VuLnZhbHVlO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVRva2VuSW5kZXggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBjb25zdCB2YWx1ZVRva2VuID0gdG9rZW5zW3ZhbHVlVG9rZW5JbmRleF07XG4gICAgaWYgKHZhbHVlVG9rZW4/LnR5cGUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnZGlhbGVjdCcgJiYgdmFsdWVUb2tlbi52YWx1ZSA9PT0gJ3NxbGl0ZScpIHJldHVybiB0cnVlO1xuICAgIGlmIChrZXkgPT09ICdkcml2ZXInICYmICh2YWx1ZVRva2VuLnZhbHVlID09PSAnZDEtaHR0cCcgfHwgdmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2R1cmFibGUtc3FsaXRlJykpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdCBpbnRvIGFsdGVybmF0aW5nIGNvZGUgYW5kIHN0cmluZy1saXRlcmFsLWNvbnRlbnQgdG9rZW5zIChxdW90ZXMgZXhjbHVkZWQpLiBUaGUgaW5wdXQgaXNcbiAqIGFscmVhZHkgY29tbWVudC1mcmVlIOKAlCB1c2VzRHJpenpsZUtpdEZvckQxIHJ1bnMgc3RyaXBKc0NvbW1lbnRzIGJlZm9yZSBhbnkgc2Nhbm5pbmcg4oCUIHNvXG4gKiBjb21tZW50IGRlbGltaXRlcnMgbmVlZCBubyBoYW5kbGluZyBoZXJlIChhIGNvbW1lbnRlZC1vdXQgYC8vIGRpYWxlY3Q6ICdzcWxpdGUnYCBjYW4gbmV2ZXJcbiAqIHJlYWNoIHRoaXMgdG9rZW5pemVyKS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTdHJpbmdzKGNvbnRlbnQ6IHN0cmluZyk6IHsgdHlwZTogJ2NvZGUnIHwgJ3N0cmluZyc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgdG9rZW5zOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgY29kZSA9ICcnO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnY29kZScsIHZhbHVlOiBjb2RlIH0pO1xuICAgICAgY29kZSA9ICcnO1xuICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpbmRleF0gIT09IGNoYXIpIHtcbiAgICAgICAgaWYgKGNvbnRlbnRbaW5kZXhdID09PSAnXFxcXCcpIGluZGV4Kys7XG4gICAgICAgIHZhbHVlICs9IGNvbnRlbnRbaW5kZXhdID8/ICcnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnc3RyaW5nJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29kZSArPSBjaGFyO1xuICB9XG4gIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqIFRoZSBmaXJzdCBgeyAuLi4gfWAgc3BhbiAoc3RyaW5nLWF3YXJlIGJyYWNlIG1hdGNoaW5nKSwgb3IgdW5kZWZpbmVkIHdoZW4gbm9uZSBleGlzdHMuICovXG5mdW5jdGlvbiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGFydEluZGV4ID0gY29udGVudC5pbmRleE9mKCd7Jyk7XG4gIGlmIChzdGFydEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgZWxzZSBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgZWxzZSBpZiAoY2hhciA9PT0gJ3snKSBkZXB0aCsrO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JyAmJiAtLWRlcHRoID09PSAwKSByZXR1cm4gY29udGVudC5zbGljZShzdGFydEluZGV4LCBpbmRleCArIDEpO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYmxvY2sgYW5kIGxpbmUgY29tbWVudHMgc28gY29tbWVudGVkLW91dCBtYXJrZXJzIChlLmcuIGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgaW4gYVxuICogUG9zdGdyZVNRTCBjb25maWcpIGNhbm5vdCBtaXNjbGFzc2lmeSB0aGUgY29uZmlnLiBUaGUgc2Nhbm5lciB0cmFja3Mgc3RyaW5nIHN0YXRlLCBzbyBgLy9gXG4gKiBpbnNpZGUgc3RyaW5nIGxpdGVyYWxzIChVUkxzIHN1Y2ggYXMgYGh0dHBzOi8vLi4uYCBpbiBjb25uZWN0aW9uIHN0cmluZ3MpIHN1cnZpdmVzIHdoaWxlXG4gKiBjb21tZW50cyBkaXJlY3RseSBhZnRlciBhIHN0cmluZyBsaXRlcmFsIGFyZSBzdGlsbCByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEpzQ29tbWVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgY29uc3QgbmV4dENoYXIgPSBjb250ZW50W2luZGV4ICsgMV07XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gY2hhciArIChuZXh0Q2hhciA/PyAnJyk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSB7XG4gICAgICAgIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dENoYXIgPT09ICcvJykge1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpbmRleF0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgcmVzdWx0ICs9ICdcXG4nO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dENoYXIgPT09ICcqJykge1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmICEoY29udGVudFtpbmRleF0gPT09ICcqJyAmJiBjb250ZW50W2luZGV4ICsgMV0gPT09ICcvJykpIGluZGV4Kys7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogeyBkaXJQYXRoOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIFtwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGhdKSB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBjYW5kaWRhdGVzLmZpbmQoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgICBpZiAoZmlsZU5hbWUpIHJldHVybiB7IGRpclBhdGgsIGZpbGVOYW1lIH07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChhYnNvbHV0ZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1mIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH0td2FsXCIgXCIke2RiUGF0aH0tc2htXCJgO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2IgZGIgJHtjb21tYW5kTmFtZX0gc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC5gKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0LCBjb21tYW5kTmFtZSk7XG4gIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRyaXp6bGVTY3JpcHRzID0gbmV3IERyaXp6bGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhcnNlRXJyb3IgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4vd3JhbmdsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdyYW5nbGVyRDFEYXRhYmFzZSB7XG4gIGJpbmRpbmc/OiBzdHJpbmc7XG4gIGRhdGFiYXNlX25hbWU/OiBzdHJpbmc7XG4gIGRhdGFiYXNlX2lkPzogc3RyaW5nO1xuICBtaWdyYXRpb25zX2Rpcj86IHN0cmluZztcbiAgbWlncmF0aW9uc19wYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEQxIGJpbmRpbmcgdXNlcyB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB0aGF0IGB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5YFxuICogd291bGQgYWN0dWFsbHkgZGlzY292ZXI6IGFuIGV4cGxpY2l0IGBtaWdyYXRpb25zX3BhdHRlcm5gIG9wdHMgaW4sIG90aGVyd2lzZSB0aGUgbWlncmF0aW9uc1xuICogZGlyZWN0b3J5IG11c3QgY29udGFpbiBmbGF0IGAqLnNxbGAgZmlsZXMgKHdyYW5nbGVyJ3MgZGVmYXVsdCBwYXR0ZXJuKS4gQSBkcml6emxlLWtpdCBgb3V0YFxuICogZGlyZWN0b3J5IHdpdGggbmVzdGVkIGA8bmFtZT4vbWlncmF0aW9uLnNxbGAgZmlsZXMgYW5kIG5vIHBhdHRlcm4gd291bGQgbWF0Y2ggbm90aGluZyBhbmRcbiAqIHNpbGVudGx5IGFwcGx5IHplcm8gbWlncmF0aW9ucywgc28gaXQgbXVzdCBmYWxsIHRocm91Z2ggdG8gdGhlIGRyaXp6bGUta2l0IG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LCBkYXRhYmFzZTogV3JhbmdsZXJEMURhdGFiYXNlKTogYm9vbGVhbiB7XG4gIC8vIEFuIGV4cGxpY2l0IHBhdHRlcm4gb3B0cyBpbnRvIHRoZSB3cmFuZ2xlci1uYXRpdmUgbWVjaGFuaXNtIGV2ZW4gYmVmb3JlIHRoZSBkaXJlY3RvcnlcbiAgLy8gZXhpc3RzOyB3cmFuZ2xlciB0aGVuIGZhaWxzIHNhZmVseSB3aXRoIFwiTm8gbWlncmF0aW9ucyBmb2xkZXIgZm91bmRcIiBpbnN0ZWFkIG9mIHdiXG4gIC8vIHNpbGVudGx5IHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBtaWdyYXRpb24gZW5naW5lLlxuICBpZiAoZGF0YWJhc2UubWlncmF0aW9uc19wYXR0ZXJuKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbWlncmF0aW9uc0RpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYXRhYmFzZS5taWdyYXRpb25zX2RpciA/PyAnbWlncmF0aW9ucycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBmcy5yZWFkZGlyU3luYyhtaWdyYXRpb25zRGlyUGF0aCkuc29tZSgoZmlsZU5hbWUpID0+IGZpbGVOYW1lLmVuZHNXaXRoKCcuc3FsJykpO1xufVxuXG5jb25zdCBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUyA9IG5ldyBTZXQoWydiaW5kaW5ncycsICdzZW5kX2VtYWlsJywgJ3JhdGVsaW1pdHMnXSk7XG5jb25zdCBSRUNPUkRfS0VZRURfQklORElOR19LRVlTID0gbmV3IFNldChbJ3dhc21fbW9kdWxlcycsICd0ZXh0X2Jsb2JzJywgJ2RhdGFfYmxvYnMnXSk7XG5cbi8qKlxuICogQ29sbGVjdCBldmVyeSBiaW5kaW5nIG5hbWUgZGVjbGFyZWQgaW4gdGhlIChlbnZpcm9ubWVudC1yZXNvbHZlZCkgY29uZmlnIHN1YnRyZWU6IGBiaW5kaW5nYFxuICogcHJvcGVydGllcyBhbnl3aGVyZSAoRDEsIEtWLCBSMiwgc2VydmljZXMsIGFzc2V0cywgcXVldWVzLCBldGMuKSwgdGhlIGBuYW1lYC1rZXllZCBiaW5kaW5nc1xuICogKGBkdXJhYmxlX29iamVjdHMuYmluZGluZ3NgLCBgbG9nZndkci5iaW5kaW5nc2AsIGBzZW5kX2VtYWlsYCwgYHJhdGVsaW1pdHNgKSwgYW5kIHRoZVxuICogcmVjb3JkLWtleWVkIGxlZ2FjeSBtb2R1bGUgYmluZGluZ3MgKGB3YXNtX21vZHVsZXNgLCBgdGV4dF9ibG9ic2AsIGBkYXRhX2Jsb2JzYCkuIEEgc2VjcmV0XG4gKiBzaGFyaW5nIGEgYmluZGluZydzIG5hbWUgd291bGQgc2lsZW50bHkgcmVwbGFjZSB0aGF0IGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZyBvbiBkZXBsb3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QmluZGluZ05hbWVzKHZhbHVlOiB1bmtub3duLCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLCBwYXJlbnRLZXkgPSAnJyk6IFNldDxzdHJpbmc+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSBjb2xsZWN0QmluZGluZ05hbWVzKGl0ZW0sIG5hbWVzLCBwYXJlbnRLZXkpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBuYW1lcztcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKGtleSA9PT0gJ2JpbmRpbmcnICYmIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzLmFkZChjaGlsZCk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICduYW1lJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnICYmIE5BTUVfS0VZRURfQklORElOR19QQVJFTlRTLmhhcyhwYXJlbnRLZXkpKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUy5oYXMoa2V5KSAmJiBjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgZm9yIChjb25zdCBiaW5kaW5nTmFtZSBvZiBPYmplY3Qua2V5cyhjaGlsZCkpIG5hbWVzLmFkZChiaW5kaW5nTmFtZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgIT09ICdlbnYnICYmIGtleSAhPT0gJ3ZhcnMnICYmIGtleSAhPT0gJ21ldGFkYXRhJyAmJiBrZXkgIT09ICdvcHRpb25zJykge1xuICAgICAgLy8gTmVzdGVkIGBlbnZgIHN1YnRyZWVzIGJlbG9uZyB0byBvdGhlciBlbnZpcm9ubWVudHM7IGB2YXJzYCB2YWx1ZXMsIGB1bnNhZmUubWV0YWRhdGFgLFxuICAgICAgLy8gYW5kIGB1bnNhZmUuYmluZGluZ3NbXS5kZXYub3B0aW9uc2AgYXJlIGFyYml0cmFyeSBKU09OIHdob3NlIHByb3BlcnRpZXMgKGUuZy4gYVxuICAgICAgLy8gXCJiaW5kaW5nXCIgZmllbGQpIGFyZSBkYXRhLCBub3QgV29ya2VyIGJpbmRpbmdzLlxuICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhjaGlsZCwgbmFtZXMsIGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHtcbiAgLyoqIFRoZSBXb3JrZXIgbmFtZSBmb3IgdGhlIGRlcGxveSBlbnZpcm9ubWVudCAod3JhbmdsZXIgYXBwZW5kcyBgLTxlbnY+YCB3aGVuIHRoZSBlbnYgc2VjdGlvbiBoYXMgbm8gb3duIG5hbWUpLiAqL1xuICB3b3JrZXJOYW1lPzogc3RyaW5nO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHZhcktleXM6IHN0cmluZ1tdO1xuICAvKiogVGhlIGVudmlyb25tZW50J3MgYHZhcnNgIHZhbHVlcyAobmVlZGVkIGZvciBDbG91ZGZsYXJlJ3MgY29tYmluZWQgY291bnQvc2l6ZSBsaW1pdHMpLiAqL1xuICB2YXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNlY3JldHMgZGVjbGFyZWQgYXMgcmVxdWlyZWQgdmlhIHdyYW5nbGVyJ3MgYHNlY3JldHMucmVxdWlyZWRgICh2YWxpZGF0ZWQgYXQgZGVwbG95IHRpbWUpLiAqL1xuICByZXF1aXJlZFNlY3JldE5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIE5hbWVzIG9mIGFsbCBub24tdmFyIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMsIHNlbmRfZW1haWwsIHNlcnZpY2VzLCAuLi4pLiAqL1xuICBiaW5kaW5nTmFtZXM6IHN0cmluZ1tdO1xuICBkMURhdGFiYXNlczogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnZpcm9ubWVudCBjb21lcyBmcm9tIGFuIGBlbnYuPG5hbWU+YCBzZWN0aW9uICh0aGVuIHdyYW5nbGVyIGNvbW1hbmRzIG5lZWRcbiAgICogYC0tZW52IDxuYW1lPmAgLyBgQ0xPVURGTEFSRV9FTlY9PG5hbWU+YCkuIGBwcm9kdWN0aW9uYCBtYXkgYmUgZWl0aGVyIHRoZSB0b3AgbGV2ZWwgb3IgYVxuICAgKiBuYW1lZCBgZW52LnByb2R1Y3Rpb25gIHNlY3Rpb247IHRoZSBzZWN0aW9uIHdpbnMgd2hlbiBpdCBleGlzdHMuXG4gICAqL1xuICB1c2VzRW52U2VjdGlvbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFJhd1dyYW5nbGVyQ29uZmlnIHtcbiAgbmFtZT86IHN0cmluZztcbiAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgdmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBkMV9kYXRhYmFzZXM/OiBXcmFuZ2xlckQxRGF0YWJhc2VbXTtcbiAgYXNzZXRzPzogdW5rbm93bjtcbiAgbG9nZndkcj86IHVua25vd247XG4gIHdhc21fbW9kdWxlcz86IHVua25vd247XG4gIHRleHRfYmxvYnM/OiB1bmtub3duO1xuICBkYXRhX2Jsb2JzPzogdW5rbm93bjtcbiAgc2l0ZT86IHVua25vd247XG4gIHNlY3JldHM/OiB7IHJlcXVpcmVkPzogc3RyaW5nW10gfTtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgUmF3V3JhbmdsZXJDb25maWc+O1xufVxuXG4vLyBXb3JrZXJzIFNpdGVzIGltcGxpY2l0bHkgYmluZHMgaXRzIEtWIG5hbWVzcGFjZSBhcyBfX1NUQVRJQ19DT05URU5ULlxuZnVuY3Rpb24gc2l0ZUJpbmRpbmdOYW1lcyhjb25maWc6IFJhd1dyYW5nbGVyQ29uZmlnLCBlbnZDb25maWc/OiBSYXdXcmFuZ2xlckNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChlbnZDb25maWc/LnNpdGUgPz8gY29uZmlnLnNpdGUpID8gWydfX1NUQVRJQ19DT05URU5UJ10gOiBbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3cmFuZ2xlciBjb25maWcgdmFsdWVzIG5lZWRlZCBmb3IgZGVwbG95aW5nIHRvIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cbiAqIEZvbGxvd3Mgd3JhbmdsZXIncyBpbmhlcml0YW5jZSBydWxlczogYGFjY291bnRfaWRgIGlzIGluaGVyaXRlZCBieSBuYW1lZCBlbnZpcm9ubWVudHMsXG4gKiB3aGlsZSBgdmFyc2AgYW5kIGBkMV9kYXRhYmFzZXNgIGFyZSBub3QgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPixcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuICBpZiAocGF0aC5leHRuYW1lKGNvbmZpZ1BhdGgpID09PSAnLnRvbWwnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkZXBsb3kgc3VwcG9ydHMgd3JhbmdsZXIuanNvbmMvd3JhbmdsZXIuanNvbiBjb25maWdzIG9ubHk7IG1pZ3JhdGUgd3JhbmdsZXIudG9tbCBmaXJzdC4nKTtcbiAgfVxuXG4gIC8vIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgd291bGQgcmV0dXJuIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCxcbiAgLy8gd2hpY2ggY291bGQgbWlncmF0ZSBhIHJlbW90ZSBkYXRhYmFzZSBmcm9tIGEgaGFsZi1yZWFkIGNvbmZpZzsgcmVqZWN0IGFueSBwYXJzZSBlcnJvci5cbiAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICBjb25zdCBjb25maWcgPSBwYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSwgcGFyc2VFcnJvcnMsIHtcbiAgICBhbGxvd1RyYWlsaW5nQ29tbWE6IHRydWUsXG4gIH0pIGFzIFJhd1dyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBpZiAocGFyc2VFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlICR7Y29uZmlnUGF0aH06ICR7cGFyc2VFcnJvcnMubGVuZ3RofSBKU09OQyBzeW50YXggZXJyb3IocykuYCk7XG4gIH1cbiAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICBjb25zdCBlbnZDb25maWcgPSBjb25maWcuZW52Py5bZW52TmFtZV07XG4gIGlmICghZW52Q29uZmlnICYmIGVudk5hbWUgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHdyYW5nbGVyIGNvbmZpZyBoYXMgbm8gXCJlbnZcIjogeyBcIiR7ZW52TmFtZX1cIjogLi4uIH0gc2VjdGlvbi5gKTtcbiAgfVxuICByZXR1cm4gZW52Q29uZmlnXG4gICAgPyB7XG4gICAgICAgIHdvcmtlck5hbWU6IGVudkNvbmZpZy5uYW1lID8/IChjb25maWcubmFtZSA/IGAke2NvbmZpZy5uYW1lfS0ke2Vudk5hbWV9YCA6IHVuZGVmaW5lZCksXG4gICAgICAgIGFjY291bnRJZDogZW52Q29uZmlnLmFjY291bnRfaWQgPz8gY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGVudkNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogZW52Q29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIC8vIE1vc3QgYmluZGluZ3MgYXJlIG5vbi1pbmhlcml0YWJsZSBhbmQgbXVzdCBiZSByZWRlY2xhcmVkIHBlciBlbnZpcm9ubWVudCwgc28gb25seSB0aGVcbiAgICAgICAgLy8gZW52aXJvbm1lbnQncyBvd24gbmFtZXMgY291bnQg4oCUIHBsdXMgdGhlIGdlbnVpbmVseSBpbmhlcml0ZWQgc2hhcGVzIChhc3NldHMsIGxvZ2Z3ZHIpLFxuICAgICAgICAvLyB3aGljaCB3cmFuZ2xlciByZXNvbHZlcyBhcyB3aG9sZSBmaWVsZHM6IHRoZSBlbnZpcm9ubWVudCdzIG93biBmaWVsZCBvdmVycmlkZXMgdGhlXG4gICAgICAgIC8vIHRvcCBsZXZlbCBlbnRpcmVseSwgc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlJ3MgbmFtZXMgY291bnQuXG4gICAgICAgIGJpbmRpbmdOYW1lczogW1xuICAgICAgICAgIC4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFzc2V0czogZW52Q29uZmlnLmFzc2V0cyA/PyBjb25maWcuYXNzZXRzLFxuICAgICAgICAgICAgICBsb2dmd2RyOiBlbnZDb25maWcubG9nZndkciA/PyBjb25maWcubG9nZndkcixcbiAgICAgICAgICAgICAgd2FzbV9tb2R1bGVzOiBlbnZDb25maWcud2FzbV9tb2R1bGVzID8/IGNvbmZpZy53YXNtX21vZHVsZXMsXG4gICAgICAgICAgICAgIHRleHRfYmxvYnM6IGVudkNvbmZpZy50ZXh0X2Jsb2JzID8/IGNvbmZpZy50ZXh0X2Jsb2JzLFxuICAgICAgICAgICAgICBkYXRhX2Jsb2JzOiBlbnZDb25maWcuZGF0YV9ibG9icyA/PyBjb25maWcuZGF0YV9ibG9icyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsZWN0QmluZGluZ05hbWVzKGVudkNvbmZpZylcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLnNpdGVCaW5kaW5nTmFtZXMoY29uZmlnLCBlbnZDb25maWcpLFxuICAgICAgICBdLFxuICAgICAgICBkMURhdGFiYXNlczogZW52Q29uZmlnLmQxX2RhdGFiYXNlcyA/PyBbXSxcbiAgICAgICAgLy8gYHNlY3JldHNgIGlzIG5vbi1pbmhlcml0YWJsZTogYSB0b3AtbGV2ZWwgcmVxdWlyZW1lbnQgbXVzdCBub3QgZm9yY2UgKG9yIHVwbG9hZClcbiAgICAgICAgLy8gYSBzZWNyZXQgaW50byBhIG5hbWVkIGVudmlyb25tZW50LlxuICAgICAgICByZXF1aXJlZFNlY3JldE5hbWVzOiBlbnZDb25maWcuc2VjcmV0cz8ucmVxdWlyZWQgPz8gW10sXG4gICAgICAgIHVzZXNFbnZTZWN0aW9uOiB0cnVlLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB3b3JrZXJOYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgYWNjb3VudElkOiBjb25maWcuYWNjb3VudF9pZCxcbiAgICAgICAgdmFyS2V5czogT2JqZWN0LmtleXMoY29uZmlnLnZhcnMgPz8ge30pLFxuICAgICAgICB2YXJzOiBjb25maWcudmFycyA/PyB7fSxcbiAgICAgICAgYmluZGluZ05hbWVzOiBbLi4uY29sbGVjdEJpbmRpbmdOYW1lcyhjb25maWcpLCAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZyldLFxuICAgICAgICBkMURhdGFiYXNlczogY29uZmlnLmQxX2RhdGFiYXNlcyA/PyBbXSxcbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogY29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogZmFsc2UsXG4gICAgICB9O1xufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIHVzZXNEcml6emxlS2l0Rm9yRDEgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCwgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkV3JhbmdsZXJDb25maWcsIFdyYW5nbGVyRDFEYXRhYmFzZSB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudiwgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcblxuLyoqXG4gKiBLZXlzIHRoYXQgZHJpdmUgdGhlIGRlcGxveSBpdHNlbGYgKG9yIGFyZSBtZWFuaW5nZnVsIG9ubHkgbG9jYWxseSkgYW5kIHRodXMgbXVzdCBuZXZlciBiZVxuICogcHVzaGVkIHRvIHRoZSBXb3JrZXIgYXMgc2VjcmV0cy4gYFdCX0VOVmAgLyBgTkVYVF9QVUJMSUNfV0JfRU5WYCBiZWxvbmcgaW4gd3JhbmdsZXIgYHZhcnNgLlxuICovXG5jb25zdCBOT05fU0VDUkVUX0tFWVMgPSBuZXcgU2V0KFtcbiAgJ0NJJyxcbiAgLy8gV3JhbmdsZXIgc3lzdGVtL2F1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcyAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvd3JhbmdsZXIvc3lzdGVtLWVudmlyb25tZW50LXZhcmlhYmxlcy8pLFxuICAvLyBpbmNsdWRpbmcgbGVnYWN5IGFsaWFzZXM7IGFwcC1zcGVjaWZpYyBuYW1lcyBzdWNoIGFzIENMT1VERkxBUkVfUjJfQUNDRVNTX0tFWV9JRCBzdGF5IGVsaWdpYmxlLlxuICAnQ0ZfQUNDT1VOVF9JRCcsXG4gICdDRl9BUElfQkFTRV9VUkwnLFxuICAnQ0ZfQVBJX0VNQUlMJyxcbiAgJ0NGX0FQSV9LRVknLFxuICAnQ0ZfQVBJX1RPS0VOJyxcbiAgJ0NGX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfU0VDUkVUJyxcbiAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FQSV9CQVNFX1VSTCcsXG4gICdDTE9VREZMQVJFX0FQSV9LRVknLFxuICAnQ0xPVURGTEFSRV9BUElfVE9LRU4nLFxuICAnQ0xPVURGTEFSRV9BVVRIX1VTRV9LRVlSSU5HJyxcbiAgJ0NMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQnLFxuICAnQ0xPVURGTEFSRV9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0VOVicsXG4gICdDTE9VREZMQVJFX0lOQ0xVREVfUFJPQ0VTU19FTlYnLFxuICAnQ0xPVURGTEFSRV9MT0FEX0RFVl9WQVJTX0ZST01fRE9UX0VOVicsXG4gICdET0NLRVJfSE9TVCcsXG4gICdIVFRQX1BST1hZJyxcbiAgJ0hUVFBTX1BST1hZJyxcbiAgJ2h0dHBfcHJveHknLFxuICAnaHR0cHNfcHJveHknLFxuICAnRk9SQ0VfQ09MT1InLFxuICAnTUlOSUZMQVJFX0NBQ0hFX0RJUicsXG4gICdNSVNFX0VOVicsXG4gICdOT19DT0xPUicsXG4gICdORVhUX1BVQkxJQ19XQl9FTlYnLFxuICAnTkVYVF9QVUJMSUNfV0JfVkVSU0lPTicsXG4gICdOT0RFX0VOVicsXG4gICdQT1JUJyxcbiAgJ1dCX0VOVicsXG4gICdXQl9WRVJTSU9OJyxcbl0pO1xuXG5jb25zdCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUyA9IFsnV1JBTkdMRVJfJywgJ0NMT1VERkxBUkVfSFlQRVJEUklWRV9MT0NBTF9DT05ORUNUSU9OX1NUUklOR18nLCAnQ0xPVURGTEFSRV9DRl9GRVRDSF8nXTtcblxuZnVuY3Rpb24gaXNOb25TZWNyZXRLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE5PTl9TRUNSRVRfS0VZUy5oYXMoa2V5KSB8fCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgRGVwbG95Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgRGVwbG95Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8RGVwbG95Q29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBEZXBsb3lDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTpcbiAgICAnRGVwbG95IGEgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcCAodmluZXh0IG9yIHBsYWluIFdvcmtlcikgdG8gdGhlIFdCX0VOViBlbnZpcm9ubWVudDogdmFsaWRhdGUgc2VjcmV0cywgYnVpbGQsIGFwcGx5IHJlbW90ZSBEMSBtaWdyYXRpb25zLCB0aGVuIGRlcGxveSBjb2RlIGFuZCBzZWNyZXRzIGF0b21pY2FsbHkuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB5YXJncyBhcyB1bmtub3duIGFzIEFyZ3Y8RGVwbG95Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2KSB7XG4gICAgLy8gQSBzdHJheSBleHBvcnRlZCBDTE9VREZMQVJFX0VOViB3b3VsZCBiYWtlIHRoZSB3cm9uZyBlbnZpcm9ubWVudCBpbnRvIHRoZSBidWlsZCBhbmRcbiAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlIG9uIGRlcGxveTsgaXQgaXMgcmUtc2V0IGV4cGxpY2l0bHkgd2hlcmUgbmVlZGVkLlxuICAgIC8vIEEgZG90ZW52IGZpbGUgZGVmaW5pbmcgaXQgc3RpbGwgc3VyZmFjZXMgdGhyb3VnaCBwcm9qZWN0LmVudiwgd2hpY2ggdGhlIGV4cGxpY2l0IGAtLWVudmBcbiAgICAvLyBmbGFncyBiZWxvdyBvdmVycmlkZS5cbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQ0xPVURGTEFSRV9FTlY7XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCB3cmFuZ2xlckNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICAgIGlmICghd3JhbmdsZXJDb25maWdQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnd2IgZGVwbG95IGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChubyB3cmFuZ2xlciBjb25maWcgZm91bmQpLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmFsdWVzIGdvIGludG8gYm90aCBwcm9jZXNzLmVudiAoaW5oZXJpdGVkIGJ5IGV2ZXJ5dGhpbmcgd2Igc3Bhd25zKSBhbmQgcHJvamVjdC5lbnZcbiAgICAvLyAodGhlIGVudmlyb25tZW50IHdiIGl0c2VsZiByZWFkcyBhbmQgcGFzc2VzIGV4cGxpY2l0bHkpOyB0aGUgbGF0dGVyIGlzIGEgY2FjaGVkIHNuYXBzaG90XG4gICAgLy8gdGFrZW4gYmVmb3JlIHRoaXMgcG9pbnQsIHNvIHdyaXRpbmcgb25seSB0byBwcm9jZXNzLmVudiB3b3VsZCBsZWF2ZSB3YidzIG93biBwcmVmbGlnaHQg4oCUXG4gICAgLy8gYW5kIGFueSBjb21tYW5kIHNwYXduZWQgd2l0aCBwcm9qZWN0LmVudiDigJQgd2l0aG91dCB0aGUgdG9rZW4uXG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlZhcnMgPSByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5yb290RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2xvdWRmbGFyZUVudlZhcnMpKSB7XG4gICAgICAvLyA/Pz0gc28gdGhhdCBhbiBleHBsaWNpdGx5IGV4cG9ydGVkIGVtcHR5IHZhbHVlIHN0aWxsIHdpbnMgb3ZlciB0aGUgZmlsZS5cbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPz89IHZhbHVlO1xuICAgICAgcHJvamVjdC5lbnZba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZENvbmZpZyA9IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudihwcm9qZWN0LCBlbnZOYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZWRDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcGFyc2UgJHt3cmFuZ2xlckNvbmZpZ1BhdGh9LmApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYWNjb3VudElkID0gcmVzb2x2ZWRDb25maWcuYWNjb3VudElkID8/IHByb2plY3QuZW52LkNMT1VERkxBUkVfQUNDT1VOVF9JRDtcbiAgICAvLyBQcmVmZXIgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgd2hlbmV2ZXIgdGhlIHJlc29sdmVkIGVudmlyb25tZW50J3MgRDEgYmluZGluZ3MgaGF2ZSBhblxuICAgIC8vIGV4aXN0aW5nIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LiBBIGRyaXp6bGUtb3JtIGRlcGVuZGVuY3kgYWxvbmUgZG9lcyBub3QgaW1wbHkgdGhlIHByb2plY3RcbiAgICAvLyBtaWdyYXRlcyBEMSB3aXRoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXI6IHRoZSBleHBsaWNpdCBtYXJrZXIgaXMgYSBkcml6emxlIGNvbmZpZ1xuICAgIC8vIHdob3NlIGRpYWxlY3QvZHJpdmVyIHRhcmdldHMgc3FsaXRlIC8gZDEtaHR0cCAvIGR1cmFibGUtc3FsaXRlIChzZWUgdXNlc0RyaXp6bGVLaXRGb3JEMTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLiBBIGRyaXp6bGUgY29uZmlnIHRhcmdldGluZyBhbm90aGVyXG4gICAgLy8gZGF0YWJhc2UgKGUuZy4gUG9zdGdyZVNRTCB2aWEgSHlwZXJkcml2ZSkgbGVhdmVzIHRoZSBEMSBiaW5kaW5ncyB1bm1hbmFnZWQgYnkgd2IgZGVwbG95LlxuICAgIGNvbnN0IHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMgPSByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5maWx0ZXIoKGRhdGFiYXNlKSA9PlxuICAgICAgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyhwcm9qZWN0LCBkYXRhYmFzZSlcbiAgICApO1xuICAgIGNvbnN0IGRyaXp6bGVLaXRNYW5hZ2VzRDEgPSB1c2VzRHJpenpsZUtpdEZvckQxKHByb2plY3QpO1xuICAgIGlmIChcbiAgICAgIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID4gMCAmJlxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPCByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIC8vIE1pZ3JhdGluZyBvbmx5IHRoZSB3cmFuZ2xlci1uYXRpdmUgc3Vic2V0IHdvdWxkIHNpbGVudGx5IGRlcGxveSBjb2RlIGFnYWluc3QgdGhlXG4gICAgICAvLyBvdGhlciwgdW5taWdyYXRlZCBkYXRhYmFzZXMuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBkb2VzIG5vdCBzdXBwb3J0IG1peGluZyB3cmFuZ2xlci1uYXRpdmUgYW5kIG5vbi1uYXRpdmUgRDEgbWlncmF0aW9uIGxheW91dHMuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGRyaXp6bGVEMURhdGFiYXNlID1cbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgZHJpenpsZUtpdE1hbmFnZXNEMSAmJiByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBzdXBwb3J0cyBkcml6emxlLWtpdCBtaWdyYXRpb25zIG9ubHkgZm9yIGEgc2luZ2xlIEQxIGJpbmRpbmc7IGZvdW5kIG11bHRpcGxlLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBtYW5hZ2VkRDFEYXRhYmFzZXMgPSBuZXcgU2V0KHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMpO1xuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkgbWFuYWdlZEQxRGF0YWJhc2VzLmFkZChkcml6emxlRDFEYXRhYmFzZSk7XG4gICAgY29uc3QgdW5tYW5hZ2VkRDFEYXRhYmFzZXMgPSByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5maWx0ZXIoKGRhdGFiYXNlKSA9PiAhbWFuYWdlZEQxRGF0YWJhc2VzLmhhcyhkYXRhYmFzZSkpO1xuICAgIGlmICh1bm1hbmFnZWREMURhdGFiYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBTYXkgc28gb3V0IGxvdWQgaW5zdGVhZCBvZiBzaWxlbnRseSBkZXBsb3lpbmcgY29kZSBhZ2FpbnN0IHVubWlncmF0ZWQgZGF0YWJhc2VzOiB0aGVcbiAgICAgIC8vIGRyaXp6bGUgbWFya2VyIGRldGVjdGlvbiBpcyBoZXVyaXN0aWMgKHRleHQgc2NhbiBvZiBkcml6emxlLmNvbmZpZy4qKSwgc28gYSBwcm9qZWN0IHRoYXRcbiAgICAgIC8vIGdlbnVpbmVseSBtaWdyYXRlcyBEMSBtdXN0IGJlIGFibGUgdG8gbm90aWNlIHdoZW4gbm8gbWVjaGFuaXNtIHdhcyBzZWxlY3RlZC4gVGhpcyBhbHNvXG4gICAgICAvLyBjb3ZlcnMgcGFydGlhbCBsYXlvdXRzIChzb21lIGJpbmRpbmdzIHdyYW5nbGVyLW5hdGl2ZSwgb3RoZXJzIHVubWFuYWdlZCkuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgTm8gRDEgbWlncmF0aW9uIG1lY2hhbmlzbSBkZXRlY3RlZCBmb3IgJHt1bm1hbmFnZWREMURhdGFiYXNlc1xuICAgICAgICAgICAgLm1hcCgoZGF0YWJhc2UpID0+IGRhdGFiYXNlLmJpbmRpbmcgPz8gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyAndW5uYW1lZCBiaW5kaW5nJylcbiAgICAgICAgICAgIC5qb2luKCcsICcpfSBgICtcbiAgICAgICAgICAgICcobm8gd3JhbmdsZXIgbWlncmF0aW9ucyBkaXJlY3RvcnkgYW5kIG5vIGRyaXp6bGUgY29uZmlnIHRhcmdldGluZyBzcWxpdGUvZDEtaHR0cC9kdXJhYmxlLXNxbGl0ZSk7IHdiIGRlcGxveSB3aWxsIG5vdCBydW4gRDEgbWlncmF0aW9ucyBmb3IgdGhlbS4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIERyeSBydW5zIGV4ZWN1dGUgbm90aGluZyBhdXRoZW50aWNhdGVkLCBzbyB0aGV5IHNraXAgdGhlIGNyZWRlbnRpYWwgcHJlZmxpZ2h0IGVudGlyZWx5LlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIC8vIEEgZHJpenpsZS1zZWxlY3RlZCBEMSBkYXRhYmFzZSByb3V0ZXMgYm90aCB0aGUgbWlncmF0aW9uIGluIHN0ZXAgMyBhbmQgYW55IGRlcGxveS9wb3N0XG4gICAgICAvLyBob29rIHRocm91Z2ggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciwgd2hpY2ggbmVlZHMgQ0xPVURGTEFSRV9BUElfVE9LRU4gZXZlbiBmb3JcbiAgICAgIC8vIGxvY2FsLCB3cmFuZ2xlci1PQXV0aCBkZXBsb3lzLiBGYWlsaW5nIGhlcmUga2VlcHMgdGhlIGZhaWwtZmFzdCBvcmRlcmluZzogYSBtaXNzaW5nIHRva2VuXG4gICAgICAvLyBtdXN0IGFib3J0IGJlZm9yZSB0aGUgZGVwbG95IGdvZXMgbGl2ZSwgbm90IGR1cmluZyBtaWdyYXRpb24gb3IgZGVwbG95L3Bvc3RcbiAgICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NTYpLiBXcmFuZ2xlci1uYXRpdmUgcHJvamVjdHMgKHdpdGggb3JcbiAgICAgIC8vIHdpdGhvdXQgaG9va3MpIG11c3Qgbm90IHJlcXVpcmUgdGhlIHRva2VuOiBhIGxvY2FsIHdyYW5nbGVyIE9BdXRoIGxvZ2luIHN1ZmZpY2VzIHRoZXJlLFxuICAgICAgLy8gZXZlbiB0aG91Z2ggc3RlcCA1IHN0aWxsIGV4cG9ydHMgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCB0byB0aGVpciBob29rcy5cbiAgICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSAmJiAhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0NMT1VERkxBUkVfQVBJX1RPS0VOIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24gPVxuICAgICAgICAhIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOIHx8XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0ZfQVBJX1RPS0VOIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0VNQUlMKSB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DRl9BUElfS0VZICYmIHByb2plY3QuZW52LkNGX0VNQUlMKTtcbiAgICAgIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSAmJiAhaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV3JhbmdsZXIgYXV0aGVudGljYXRpb24gKGUuZy4gQ0xPVURGTEFSRV9BUElfVE9LRU4pIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBvbiBDSS4nKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHAtc3BlY2lmaWMgdmFsaWRhdGlvbiBob29rIChlLmcuIHNlY3JldCBwYWlycyB0aGF0IG11c3QgYmUgYm90aC1zZXQtb3ItYm90aC1lbXB0eSkuXG4gICAgLy8gVGhlIHJldXNhYmxlIGRlcGxveS55bWwgYWxyZWFkeSBydW5zIGl0IG9uIENJOyBydW4gaXQgaGVyZSBmb3IgbG9jYWwgZGVwbG95cy5cbiAgICBpZiAoIWlzQ0kocHJvamVjdC5lbnYuQ0kpICYmIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvY2ktc2V0dXAnXSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBkZXBsb3kvY2ktc2V0dXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICAvLyAxLiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhbGwgc2VjcmV0cyBiZWZvcmUgYW55IGJ1aWxkIG9yIHJlbW90ZSBtdXRhdGlvbiwgc28gYSBtaXNzaW5nXG4gICAgLy8gICAgc2VjcmV0IGFib3J0cyB0aGUgZGVwbG95IGluc3RlYWQgb2YgbGVhdmluZyBhIG1pZ3JhdGVkIGRhdGFiYXNlIGJlaGluZCBhbiBvbGQgV29ya2VyLlxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZTb3VyY2VzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBSZXN0cmljdCB0aGUgc2VjcmV0cyBkb21haW4gdG8ga2V5cyB0aGUgcHJvamVjdCdzIGZub3ggY29uZmlndXJhdGlvbiBkZWNsYXJlczogYG1pc2UgZW52YFxuICAgIC8vIG91dHB1dCAocmVwb3J0ZWQgYXMgYSBwc2V1ZG8tc291cmNlKSBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgQ0FSR09fSE9NRSxcbiAgICAvLyB3aGljaCBtdXN0IG5ldmVyIGJlIHVwbG9hZGVkIGFzIFdvcmtlciBzZWNyZXRzLlxuICAgIGNvbnN0IGZub3hLZXlzID0gbmV3IFNldChcbiAgICAgIGVudlNvdXJjZXMuZmlsdGVyKChbc291cmNlXSkgPT4gIXNvdXJjZS5zdGFydHNXaXRoKCdtaXNlIGVudicpKS5mbGF0TWFwKChbLCBrZXlzXSkgPT4ga2V5cylcbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWZub3hLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICAvLyBOYW1lcyBkZWNsYXJlZCB2aWEgd3JhbmdsZXIgYHNlY3JldHMucmVxdWlyZWRgIG1heSBsaWtld2lzZSBiZSBzdXBwbGllZCBwdXJlbHkgYXNcbiAgICAvLyBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4gQ0kgd29ya2Zsb3cgZW52KSBpbnN0ZWFkIG9mIGZub3ggdmFsdWVzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4cG9ydGVkVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGV4cG9ydGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZXhwb3J0ZWRWYWx1ZTtcbiAgICB9XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIChwcm9qZWN0LmVudiBhbHJlYWR5XG4gICAgLy8gYXBwbGllcyB0aGF0IHByZWNlZGVuY2UpLCBvciBgQVVUSF9TRUNSRVQ9Li4uIHdiIGRlcGxveWAgd291bGQgcHVzaCB0aGUgc3RhbGUgZmlsZSB2YWx1ZS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzZWNyZXRzID0gc2VsZWN0V29ya2VyU2VjcmV0cyhlbnZWYXJzLCBbLi4ucmVzb2x2ZWRDb25maWcudmFyS2V5cywgLi4ucmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXSk7XG4gICAgLy8gYC0tdmFyIFdCX1ZFUlNJT046Li4uYCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgb24gZGVwbG95LCBzbyBhXG4gICAgLy8gcmVzb3VyY2UgYmluZGluZyBvZiB0aGF0IG5hbWUgd291bGQgc2lsZW50bHkgYmVjb21lIGEgc3RyaW5nIHZhcmlhYmxlLlxuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OICYmIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcygnV0JfVkVSU0lPTicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV0JfVkVSU0lPTiBjb2xsaWRlcyB3aXRoIGEgV29ya2VyIGJpbmRpbmcgbmFtZTsgcmVuYW1lIHRoZSBiaW5kaW5nLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYmluZGluZ0NvbGxpc2lvbnMgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5maWx0ZXIoKGtleSkgPT4gcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKGtleSkpO1xuICAgIGlmIChiaW5kaW5nQ29sbGlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBVcGxvYWRpbmcgYSBzZWNyZXQgbmFtZWQgbGlrZSBhIGJpbmRpbmcgd291bGQgcmVwbGFjZSB0aGUgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYFNraXBwaW5nIGVudiBrZXlzIHRoYXQgY29sbGlkZSB3aXRoIFdvcmtlciBiaW5kaW5nIG5hbWVzOiAke2JpbmRpbmdDb2xsaXNpb25zLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBgc2VjcmV0cy5yZXF1aXJlZGAgb25seSBkdXJpbmcgdGhlIHJlYWwgdXBsb2FkIOKAlCBhZnRlciBtaWdyYXRpb25zIOKAlFxuICAgIC8vIHNvIHdiIGNoZWNrcyB1cGZyb250OiBlYWNoIHJlcXVpcmVkIG5hbWUgbXVzdCBiZSBhIGtleSBpbiB0aGUgb3V0Z29pbmcgcGF5bG9hZCAocHJlc2VuY2UsXG4gICAgLy8gbm90IHRydXRoaW5lc3Mg4oCUIGFuIGV4cGxpY2l0IGVtcHR5IGNsZWFycyBhIHN0YWxlIHZhbHVlKSBvciBhbiBlZmZlY3RpdmUgdmFyL2JpbmRpbmcuXG4gICAgY29uc3QgdW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzID0gcmVzb2x2ZWRDb25maWcucmVxdWlyZWRTZWNyZXROYW1lcy5maWx0ZXIoXG4gICAgICAobmFtZSkgPT5cbiAgICAgICAgIU9iamVjdC5oYXNPd24oc2VjcmV0cywgbmFtZSkgJiZcbiAgICAgICAgIXJlc29sdmVkQ29uZmlnLnZhcktleXMuaW5jbHVkZXMobmFtZSkgJiZcbiAgICAgICAgIXJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhuYW1lKVxuICAgICk7XG4gICAgaWYgKHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFNlY3JldHMgcmVxdWlyZWQgYnkgdGhlIHdyYW5nbGVyIGNvbmZpZyBhcmUgbm90IHByb3ZpZGVkOiAke3Vuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0S2V5cyA9IE9iamVjdC5rZXlzKHNlY3JldHMpLnRvU29ydGVkKCk7XG4gICAgLy8gQ2xvdWRmbGFyZSBsaW1pdHMgYSBidWxrIHVwbG9hZCB0byAxMDAgc2VjcmV0cywgZWFjaCB2YXJpYWJsZS9zZWNyZXQgdmFsdWUgdG8gNSBLQiwgYW5kXG4gICAgLy8gdGhlIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBjb3VudCB0byAxMjggKDY0IG9uIHRoZSBGcmVlIHBsYW4sIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZFxuICAgIC8vIGhlcmUg4oCUIGhlbmNlIGEgd2FybmluZykuIEZhaWxpbmcgYmVmb3JlIGFueSBidWlsZCBvciBtaWdyYXRpb24ga2VlcHMgYW4gb3ZlcnNpemVkIHBheWxvYWRcbiAgICAvLyBmcm9tIGFib3J0aW5nIHRoZSBkZXBsb3kgYWZ0ZXIgcmVtb3RlIG1pZ3JhdGlvbnMgYWxyZWFkeSByYW4uXG4gICAgaWYgKHNlY3JldEtleXMubGVuZ3RoID4gMTAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYENsb3VkZmxhcmUgYWNjZXB0cyBhdCBtb3N0IDEwMCBzZWNyZXRzIHBlciBkZXBsb3ksIGJ1dCAke3NlY3JldEtleXMubGVuZ3RofSB3ZXJlIHNlbGVjdGVkLmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBUaGUgQ0xJLXByb3ZpZGVkIFdCX1ZFUlNJT04gb3ZlcmxheXMgYSBjb25maWd1cmVkIHZhciBvZiB0aGUgc2FtZSBuYW1lIG9uIGRlcGxveSxcbiAgICAvLyBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUgcGFydGljaXBhdGVzIGluIHRoZSBsaW1pdCBjaGVja3MuXG4gICAgY29uc3QgZWZmZWN0aXZlVmFycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXM8dW5rbm93bj4ocmVzb2x2ZWRDb25maWcudmFycykpO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSBlZmZlY3RpdmVWYXJzLnNldCgnV0JfVkVSU0lPTicsIHByb2plY3QuZW52LldCX1ZFUlNJT04pO1xuICAgIGNvbnN0IHZhckVudHJpZXMgPSBbLi4uZWZmZWN0aXZlVmFyc107XG4gICAgY29uc3Qgb3ZlcnNpemVkS2V5cyA9IFtcbiAgICAgIC4uLnNlY3JldEtleXMuZmlsdGVyKChrZXkpID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHNlY3JldHNba2V5XSA/PyAnJywgJ3V0ZjgnKSA+IDUgKiAxMDI0KSxcbiAgICAgIC4uLnZhckVudHJpZXNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoWywgdmFsdWVdKSA9PiBCdWZmZXIuYnl0ZUxlbmd0aCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICd1dGY4JykgPiA1ICogMTAyNFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgIF07XG4gICAgaWYgKG92ZXJzaXplZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFZhcmlhYmxlIG9yIHNlY3JldCB2YWx1ZXMgZXhjZWVkIENsb3VkZmxhcmUncyA1IEtCIGxpbWl0OiAke292ZXJzaXplZEtleXMuam9pbignLCAnKX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIGAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmU6IHJlbW90ZSBzZWNyZXRzIGFic2VudCBmcm9tIHRoZSBwYXlsb2FkIHN0YXkgYXR0YWNoZWQgdG8gdGhlXG4gICAgLy8gbmV3IHZlcnNpb24sIHNvIHRoZXkgY291bnQgYWdhaW5zdCB0aGUgY29tYmluZWQgbGltaXQgdG9vLiBMaXN0aW5nIHRoZW0gbmVlZHMgYW5cbiAgICAvLyBhdXRoZW50aWNhdGVkIHJlbW90ZSByb3VuZC10cmlwLCB3aGljaCBkcnkgcnVucyBza2lwOyB3aGVuIHRoZSBsaXN0aW5nIGZhaWxzIGZvciBhbnlcbiAgICAvLyByZWFzb24gb3RoZXIgdGhhbiBhIG5vdC15ZXQtY3JlYXRlZCBXb3JrZXIsIGRlZ3JhZGUgdG8gdGhlIGxvY2FsLW9ubHkgY291bnQgaW5zdGVhZCBvZlxuICAgIC8vIGJsb2NraW5nIGEgZGVwbG95IHRoYXQgd3JhbmdsZXIgaXRzZWxmIG1pZ2h0IGFjY2VwdC5cbiAgICBjb25zdCByZW1vdGVTZWNyZXROYW1lcyA9IGFyZ3YuZHJ5UnVuXG4gICAgICA/IFtdXG4gICAgICA6IGF3YWl0IGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhwcm9qZWN0LCBhcmd2LCB3cmFuZ2xlckNvbmZpZ1BhdGgsIHJlc29sdmVkQ29uZmlnLCBlbnZOYW1lKTtcbiAgICBjb25zdCBpbmhlcml0ZWRTZWNyZXROYW1lcyA9IHNlbGVjdEluaGVyaXRlZFJlbW90ZVNlY3JldE5hbWVzKFxuICAgICAgcmVtb3RlU2VjcmV0TmFtZXMgPz8gW10sXG4gICAgICBzZWNyZXRzLFxuICAgICAgdmFyRW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgICAgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXG4gICAgKTtcbiAgICBjb25zdCBjb21iaW5lZENvdW50ID1cbiAgICAgIG5ldyBTZXQoWy4uLnNlY3JldEtleXMsIC4uLnZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KV0pLnNpemUgKyBpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGg7XG4gICAgY29uc3QgaW5oZXJpdGVkTm90ZSA9XG4gICAgICBpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwXG4gICAgICAgID8gYCAoaW5jbHVkaW5nICR7aW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RofSByZW1vdGUgc2VjcmV0cyBrZXB0IGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb246ICR7aW5oZXJpdGVkU2VjcmV0TmFtZXMuam9pbignLCAnKX0pYFxuICAgICAgICA6ICcnO1xuICAgIGlmIChjb21iaW5lZENvdW50ID4gMTI4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYENsb3VkZmxhcmUgYWxsb3dzIGF0IG1vc3QgMTI4IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBjb21iaW5lZCwgYnV0ICR7Y29tYmluZWRDb3VudH0gd2VyZSBzZWxlY3RlZCR7aW5oZXJpdGVkTm90ZX0uYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDY0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgJHtjb21iaW5lZENvdW50fSB2YXJpYWJsZXMgYW5kIHNlY3JldHMke2luaGVyaXRlZE5vdGV9IGV4Y2VlZCB0aGUgRnJlZSBwbGFuJ3MgbGltaXQgb2YgNjQuYClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgIGBEZXBsb3lpbmcgJHtyZXNvbHZlZENvbmZpZy53b3JrZXJOYW1lID8/IHByb2plY3QubmFtZX0gKCR7ZW52TmFtZX0pIHdpdGggJHtzZWNyZXRLZXlzLmxlbmd0aH0gc2VjcmV0czogJHtzZWNyZXRLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyAyLiBCdWlsZCAodmluZXh0IGVtYmVkcyB0aGUgZW52aXJvbm1lbnQtYXBwbGllZCB3cmFuZ2xlciBjb25maWcgaW50byBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uKS5cbiAgICAvLyAgICBCdWlsZGluZyBiZWZvcmUgbWlncmF0aW5nIGtlZXBzIGEgYnVpbGQgZmFpbHVyZSBmcm9tIGxlYXZpbmcgYSBtaWdyYXRlZCBzY2hlbWEgYmVoaW5kXG4gICAgLy8gICAgdGhlIG9sZCBXb3JrZXIuIFBsYWluIFdvcmtlcnMgaGF2ZSBubyBidWlsZCBzdGVwOyB3cmFuZ2xlciBidW5kbGVzIHRoZSBlbnRyeSBpdHNlbGYuXG4gICAgY29uc3QgaXNWaW5leHQgPSAhIShwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udmluZXh0ID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aW5leHQpO1xuICAgIGNvbnN0IGRlcGxveUNvbmZpZ1BhdGggPSBpc1ZpbmV4dCA/IHBhdGguam9pbignZGlzdCcsICdzZXJ2ZXInLCAnd3JhbmdsZXIuanNvbicpIDogd3JhbmdsZXJDb25maWdQYXRoO1xuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZBc3NpZ25tZW50ID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb25cbiAgICAgID8gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnQ0xPVURGTEFSRV9FTlYnLCBlbnZOYW1lKX0gYFxuICAgICAgOiAnJztcbiAgICBpZiAoaXNWaW5leHQpIHtcbiAgICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSB7XG4gICAgICAgIHByb2plY3QuZW52Lk5FWFRfUFVCTElDX1dCX1ZFUlNJT04gfHw9IHByb2plY3QuZW52LldCX1ZFUlNJT047XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBnZW4tY29kZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke2Nsb3VkZmxhcmVFbnZBc3NpZ25tZW50fVlBUk4gdmluZXh0IGJ1aWxkYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAvLyBPbiBkcnkgcnVucyB0aGUgdmluZXh0IGJ1aWxkIGFib3ZlIGlzIGEgcHJpbnRlZCBuby1vcCwgc28gdGhlIGJ1aWx0IGNvbmZpZyBpc1xuICAgICAgLy8gbGVnaXRpbWF0ZWx5IGFic2VudCBhbmQgbXVzdCBub3QgYWJvcnQgdGhlIHJ1bi5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGVwbG95Q29uZmlnUGF0aCkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGAke2RlcGxveUNvbmZpZ1BhdGh9IG5vdCBmb3VuZDsgdGhlIHZpbmV4dCBidWlsZCBkaWQgbm90IHByb2R1Y2UgYSBkZXBsb3kgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGl0cyBjb25maWcgc2NoZW1hIG9ubHkgd2hlbiBpdCBydW5zLCBzbyBhIGRyeSBydW4gb2YgdGhlIGJ1aWx0XG4gICAgICAvLyBjb25maWcgc3VyZmFjZXMgY29uZmlnIGFuZCBidW5kbGUgZXJyb3JzIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnMgYmVsb3cgbXV0YXRlXG4gICAgICAvLyB0aGUgZGF0YWJhc2UsIG1pcnJvcmluZyB0aGUgcGxhaW4tV29ya2VyIGRyeSBydW4uIE5vIC0tZW52OiB0aGUgYnVpbHQgY29uZmlnIGFscmVhZHlcbiAgICAgIC8vIGhhcyB0aGUgZW52aXJvbm1lbnQgYXBwbGllZC5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYFlBUk4gd3JhbmdsZXIgZGVwbG95IC0tZHJ5LXJ1biAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGVwbG95Q29uZmlnUGF0aCl9YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGxhaW4gV29ya2VycyBhcmUgZmlyc3QgY29tcGlsZWQgYnkgd3JhbmdsZXIgZHVyaW5nIHRoZSBkZXBsb3kgaXRzZWxmOyBhIGRyeSBydW5cbiAgICAgIC8vIHN1cmZhY2VzIGNvbXBpbGUgZXJyb3JzIChlLmcuIGEgbWlzc2luZyBlbnRyeSBwb2ludCkgQkVGT1JFIHRoZSByZW1vdGUgbWlncmF0aW9uc1xuICAgICAgLy8gYmVsb3cgbXV0YXRlIHRoZSBkYXRhYmFzZS5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYFlBUk4gd3JhbmdsZXIgZGVwbG95IC0tZHJ5LXJ1biAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQod3JhbmdsZXJDb25maWdQYXRoKX0ke3Jlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQXBwbHkgRDEgbWlncmF0aW9ucyB0byB0aGUgcmVtb3RlIGRhdGFiYXNlIHdpdGggdGhlIHByb2plY3QncyBzaW5nbGUgbWlncmF0aW9uXG4gICAgLy8gICAgbWVjaGFuaXNtICh3cmFuZ2xlci1uYXRpdmUgd2hlbiBhIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGV4aXN0cywgZWxzZSBkcml6emxlLWtpdCB3aGVuXG4gICAgLy8gICAgdGhlIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpLiBNaWdyYXRpb25zIG11c3QgYmUgYmFja3dhcmRcbiAgICAvLyAgICBjb21wYXRpYmxlOiB0aGUgb2xkIFdvcmtlciBzZXJ2ZXNcbiAgICAvLyAgICB0cmFmZmljIHVudGlsIHRoZSBkZXBsb3kgYmVsb3cuXG4gICAgY29uc3QgZW52T3B0aW9uID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyc7XG4gICAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKSB7XG4gICAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/IGRhdGFiYXNlLmJpbmRpbmc7XG4gICAgICBpZiAoIWRhdGFiYXNlTmFtZSkgY29udGludWU7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGF0YWJhc2VOYW1lKX0gLS1yZW1vdGUgLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtlbnZPcHRpb259YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSB7XG4gICAgICBpZiAoIWRyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBUaGUgJHtlbnZOYW1lfSBEMSBiaW5kaW5nIGhhcyBubyBkYXRhYmFzZV9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFhY2NvdW50SWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEIChvciBhY2NvdW50X2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcpIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAnbWlncmF0ZScsXG4gICAgICAgICAgYENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ9JHtkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZH0gQ0xPVURGTEFSRV9BQ0NPVU5UX0lEPSR7YWNjb3VudElkfWBcbiAgICAgICAgKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA0LiBEZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5IChubyBwb3N0LWRlcGxveSBzZWNyZXQgcHVzaCB0aGF0IGNvdWxkIGxlYXZlIHRoZVxuICAgIC8vICAgIG5ldyB2ZXJzaW9uIHJ1bm5pbmcgd2l0aG91dCDigJQgb3Igd2l0aCBzdGFsZSDigJQgc2VjcmV0cykuIFRoZSBzZWNyZXRzIEpTT04gZ29lcyB0aHJvdWdoXG4gICAgLy8gICAgYSBtb2RlLTA2MDAgZmlsZSBpbiBhIHByaXZhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBkZWxldGVkIHJpZ2h0IGFmdGVyIHRoZSBkZXBsb3k6XG4gICAgLy8gICAgL2Rldi9zdGRpbiBpcyBOT1QgcmVsaWFibGUgaGVyZSBiZWNhdXNlIHdyYW5nbGVyIHJlYWRzIHRoZSBzZWNyZXRzIGZpbGUgb25seSBhZnRlclxuICAgIC8vICAgIHVwbG9hZGluZyBhc3NldHMsIGJ5IHdoaWNoIHBvaW50IHRoZSBwaXBlZCBzdGRpbiBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY29uc3VtZWQg4oCUXG4gICAgLy8gICAgb2JzZXJ2ZWQgYXMgYSBmbGFreSBgQ291bGQgbm90IHJlYWQgZmlsZTogL2Rldi9zdGRpbmAgb24gQ0kuIEV4cGxpY2l0bHkgZW1wdHkgdmFsdWVzXG4gICAgLy8gICAgc3RheSBpbiB0aGUgcGF5bG9hZDogLS1zZWNyZXRzLWZpbGUgaXMgYWRkaXRpdmUsIHNvIHB1c2hpbmcgJycgaXMgdGhlIG9ubHkgd2F5IHRvXG4gICAgLy8gICAgY2xlYXIgYSBzdGFsZSBzZWNyZXQuXG4gICAgY29uc3QgZGVwbG95QXJncyA9IFtcbiAgICAgICdkZXBsb3knLFxuICAgICAgJy0tY29uZmlnJyxcbiAgICAgIGRlcGxveUNvbmZpZ1BhdGgsXG4gICAgICAvLyB2aW5leHQncyBidWlsdCBjb25maWcgYWxyZWFkeSBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQ7IHBhc3NpbmcgLS1lbnYgdGhlcmUgd291bGRcbiAgICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2UuXG4gICAgICAuLi4oIWlzVmluZXh0ICYmIHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuZW52LldCX1ZFUlNJT04gPyBbJy0tdmFyJywgYFdCX1ZFUlNJT046JHtwcm9qZWN0LmVudi5XQl9WRVJTSU9OfWBdIDogW10pLFxuICAgICAgJy0tc2VjcmV0cy1maWxlJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2RlcGxveUFyZ3Muam9pbignICcpfSA8dGVtcG9yYXJ5IHNlY3JldHMgZmlsZT5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0KTtcbiAgICAgIGNvbnN0IGRlcGxveUVudiA9IHsgLi4ucHJvamVjdC5lbnYgfTtcbiAgICAgIGRlbGV0ZSBkZXBsb3lFbnYuQ0xPVURGTEFSRV9FTlY7XG4gICAgICAvLyAwbzcwMCBkaXJlY3RvcnkgKyAwbzYwMCBmaWxlOiByZWFkYWJsZSBvbmx5IGJ5IHRoZSBkZXBsb3lpbmcgdXNlciwgbGlrZSB0aGUgZG90ZW52XG4gICAgICAvLyBmaWxlcyB0aGUgQ0kgd29ya2Zsb3cgYWxyZWFkeSB3cml0ZXMgbmV4dCB0byBpdC4gd3JhbmdsZXIgcnVucyB0aHJvdWdoIGFuIGFzeW5jIHNwYXduXG4gICAgICAvLyAoc3Bhd25TeW5jIHdvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wLCBzbyBhIHNodXRkb3duIHNpZ25hbCB3b3VsZCBraWxsIHRoZSBwcm9jZXNzXG4gICAgICAvLyBiZWZvcmUgYW55IGNsZWFudXApIGFuZCB0aGUgZGlyZWN0b3J5IGlzIHJlbW92ZWQgaW4gYSBmaW5hbGx5LCBzbyBhbiBpbnRlcnJ1cHRlZFxuICAgICAgLy8gZGVwbG95IGNhbm5vdCBsZWF2ZSB0aGUgcGxhaW50ZXh0IHNlY3JldHMgYmVoaW5kLiBTaHV0ZG93biBoYW5kbGluZyBkZXRhaWxzOlxuICAgICAgLy8gLSBIYW5kbGVycyAoaW5jbHVkaW5nIFNJR0hVUCwgb24gd2hpY2ggTm9kZSBhbHNvIHRlcm1pbmF0ZXMgYnkgZGVmYXVsdCkgYXJlIGluc3RhbGxlZFxuICAgICAgLy8gICBCRUZPUkUgdGhlIGZpbGUgaXMgd3JpdHRlbiBhbmQgdXNlIHByb2Nlc3Mub24sIG5vdCBvbmNlLCBzbyBhIHJlcGVhdGVkIHNpZ25hbCBjYW5ub3RcbiAgICAgIC8vICAgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdGVybWluYXRpb24gYW5kIGJ5cGFzcyB0aGUgZmluYWxseSBjbGVhbnVwLlxuICAgICAgLy8gLSBTSUdIVVAvU0lHUVVJVCBhcmUgZm9yd2FyZGVkIHRvIHdyYW5nbGVyIGFzIFNJR1RFUk06IHdyYW5nbGVyJ3MgbGF1bmNoZXIgcmVsYXlzIG9ubHlcbiAgICAgIC8vICAgU0lHSU5UL1NJR1RFUk0gdG8gaXRzIGlubmVyIE5vZGUgcHJvY2VzcywgYW5kIGFueXRoaW5nIGVsc2Ugd291bGQgb3JwaGFuIGEgZGVwbG95bWVudFxuICAgICAgLy8gICB0aGF0IGtlZXBzIG11dGF0aW5nIHRoZSByZW1vdGUgV29ya2VyIGFmdGVyIHdiIGV4aXRzLlxuICAgICAgLy8gLSBUaGUgcmUtcmFpc2UgYmVsb3cgdXNlcyB0aGUgc2lnbmFsIHdiIGl0c2VsZiByZWNlaXZlZDogd3JhbmdsZXIgY2F0Y2hlcyBTSUdJTlQgYW5kXG4gICAgICAvLyAgIGV4aXRzIG51bWVyaWNhbGx5IChlLmcuIDE0MyksIHdoaWNoIG11c3Qgbm90IG1hc3F1ZXJhZGUgYXMgYW4gb3JkaW5hcnkgZmFpbHVyZS5cbiAgICAgIGNvbnN0IHNlY3JldHNEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2ItZGVwbG95LScpKTtcbiAgICAgIGNvbnN0IHNodXRkb3duU2lnbmFscyA9IFsnU0lHSFVQJywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGxldCB3cmFuZ2xlclByb2Nlc3M6IFJldHVyblR5cGU8dHlwZW9mIHNwYXduPiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCByZWNlaXZlZFNodXRkb3duU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlY2VpdmVkU2h1dGRvd25TaWduYWwgPz89IHNpZ25hbDtcbiAgICAgICAgICBpZiAod3JhbmdsZXJQcm9jZXNzKSB7XG4gICAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mua2lsbChzaWduYWwgPT09ICdTSUdJTlQnIHx8IHNpZ25hbCA9PT0gJ1NJR1RFUk0nID8gc2lnbmFsIDogJ1NJR1RFUk0nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gV2l0aCB0aGUgaGFuZGxlcnMgcmVtb3ZlZCwgcmUtcmFpc2luZyB0cmlnZ2VycyB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBsZXQgZGVwbG95U3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZWNyZXRzRmlsZVBhdGggPSBwYXRoLmpvaW4oc2VjcmV0c0RpclBhdGgsICdzZWNyZXRzLmpzb24nKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhzZWNyZXRzRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlY3JldHMpLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICBkZXBsb3lTdGF0dXMgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzID0gc3Bhd24oJ3dyYW5nbGVyJywgWy4uLmRlcGxveUFyZ3MsIHNlY3JldHNGaWxlUGF0aF0sIHtcbiAgICAgICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZW52OiBkZXBsb3lFbnYgYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J10sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXNvbHZlKDEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc2lnbmFsID8gMSA6IChjb2RlID8/IHVuZGVmaW5lZCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIHByb2Nlc3MuZXhpdCBza2lwcyBmaW5hbGx5IGJsb2Nrcywgc28gdGhlIGV4aXQtb24tZmFpbHVyZSBiZWxvdyBzdGF5cyBvdXRzaWRlLlxuICAgICAgICBmb3IgKGNvbnN0IFtzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHNlY3JldHNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBpZiAocmVjZWl2ZWRTaHV0ZG93blNpZ25hbCkge1xuICAgICAgICAvLyBSZS1yYWlzZSBzbyB0aGUgY2FsbGVyIG9ic2VydmVzIHRoZSBzYW1lIHNpZ25hbC1kZXJpdmVkIGV4aXQgc3RhdHVzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHJlY2VpdmVkU2h1dGRvd25TaWduYWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGVwbG95U3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGB3cmFuZ2xlciBkZXBsb3kgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZGVwbG95U3RhdHVzID8/ICd1bmtub3duJ30uYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoZGVwbG95U3RhdHVzID8/IDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIE9wdGlvbmFsIHBvc3QtZGVwbG95IGhvb2sgKGUuZy4gc2VlZGluZyB0aGUgcmVtb3RlIEQxIHZpYSBkcml6emxlJ3MgZDEtaHR0cCBkcml2ZXIpLlxuICAgIC8vICAgIEFzc2lnbiB0aGUgcmVzb2x2ZWQgaWRzIHVuY29uZGl0aW9uYWxseTogYSBzdGFsZSBleHBvcnRlZCBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEXG4gICAgLy8gICAgbXVzdCBub3QgcmVkaXJlY3QgdGhlIGhvb2sgdG8gYW5vdGhlciBkYXRhYmFzZS5cbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9wb3N0J10pIHtcbiAgICAgIC8vIFRoZSBpZCBpcyB1bmFtYmlndW91cyBvbmx5IHdpdGggYSBzaW5nbGUgRDEgYmluZGluZzsgd2l0aCBtdWx0aXBsZSwgdGhlIGhvb2sgbXVzdFxuICAgICAgLy8gcmVzb2x2ZSBpdHMgdGFyZ2V0IGl0c2VsZi4gQ2xlYXIgZmlyc3QgZWl0aGVyIHdheTogYSBzdGFsZSBpbmhlcml0ZWQgaWQgbXVzdCBub3RcbiAgICAgIC8vIHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgICBjb25zdCBob29rRDFEYXRhYmFzZTogV3JhbmdsZXJEMURhdGFiYXNlIHwgdW5kZWZpbmVkID1cbiAgICAgICAgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID09PSAxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRDtcbiAgICAgIGlmIChyZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coJ011bHRpcGxlIEQxIGJpbmRpbmdzIGV4aXN0OyBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEIGlzIG5vdCBzZXQgZm9yIGRlcGxveS9wb3N0LicpKTtcbiAgICAgIH1cbiAgICAgIGlmIChob29rRDFEYXRhYmFzZT8uZGF0YWJhc2VfaWQpIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgPSBob29rRDFEYXRhYmFzZS5kYXRhYmFzZV9pZDtcbiAgICAgIGlmIChhY2NvdW50SWQpIHByb2plY3QuZW52LkNMT1VERkxBUkVfQUNDT1VOVF9JRCA9IGFjY291bnRJZDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L3Bvc3QnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIENsb3VkZmxhcmUgQVBJIHRva2VuIHRoYXQgQ0kgZHJvcHMgaW4gYSBgLmVudi5jbG91ZGZsYXJlYCBmaWxlIChlLmcuIHRoZSByZXVzYWJsZVxuICogZGVwbG95IHdvcmtmbG93J3MgYGZpbGVfcGF0aF8xYCksIGxvb2tpbmcgYmVzaWRlIHRoZSBXb3JrZXIncyB3cmFuZ2xlciBjb25maWcgYW5kIGF0IHRoZVxuICogbW9ub3JlcG8gcm9vdCDigJQgYGZpbGVfcGF0aF8xYCBpcyByZXBvLXJlbGF0aXZlLCBzbyBib3RoIHNwZWxsaW5ncyBvY2N1ciBpbiBwcmFjdGljZS5cbiAqIE5lYXJlciBmaWxlcyB3aW46IGEgd29ya3NwYWNlIG1heSBvdmVycmlkZSB0aGUgcm9vdCB0b2tlbiwgbmV2ZXIgdGhlIHJldmVyc2UuXG4gKiBgQ0xPVURGTEFSRV9FTlZgIGlzIGRyb3BwZWQ7IGl0IHdvdWxkIGRvdWJsZS1hcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGN1cnJlbnREaXJQYXRoIG9mIG5ldyBTZXQocm9vdERpclBhdGggPyBbZGlyUGF0aCwgcm9vdERpclBhdGhdIDogW2RpclBhdGhdKSkge1xuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnLmVudi5jbG91ZGZsYXJlJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNsb3VkZmxhcmVFbnZQYXRoKSkgY29udGludWU7XG4gICAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogY2xvdWRmbGFyZUVudlBhdGgsIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ0NMT1VERkxBUkVfRU5WJykgY29udGludWU7XG4gICAgICBlbnZWYXJzW2tleV0gPz89IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNlY3JldHMgdG8gcHVzaCB0byB0aGUgV29ya2VyIGZyb20gdGhlIGRvdGVudi1sb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogZXZlcnkgZXhwbGljaXRseSBzZXQgdmFsdWUg4oCUIGluY2x1ZGluZyBlbXB0eSBzdHJpbmdzLCB3aGljaCBjbGVhciBzdGFsZSByZW1vdGUgc2VjcmV0c1xuICogc2luY2UgYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmUg4oCUIGV4Y2VwdCB3cmFuZ2xlciBgdmFyc2AgKGEgc2VjcmV0IG1heVxuICogbm90IHNoYXJlIGEgbmFtZSB3aXRoIGEgdmFyKSwgZGVwbG95LWNvbnRyb2wga2V5cywgYW5kIGxvY2FsIGBmaWxlOmAgREFUQUJBU0VfVVJMcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdvcmtlclNlY3JldHMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29uZmlnVmFyS2V5czogc3RyaW5nW10pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY29uZmlnS2V5cyA9IG5ldyBTZXQoY29uZmlnVmFyS2V5cyk7XG4gIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gTm8gcnVudGltZSB1bmRlZmluZWQgY2hlY2sgb24gYHZhbHVlYDogZW52VmFycyBpcyBidWlsdCBleGNsdXNpdmVseSBmcm9tIGRvdGVudi1wYXJzZWRcbiAgLy8gc3RyaW5ncywgYW5kIGV2ZXJ5IGNhbGxlci1zaWRlIG1lcmdlIGVpdGhlciBjb2FsZXNjZXMgd2l0aCBgPz8gJydgIG9yIGd1YXJkcyBhZ2FpbnN0XG4gIC8vIHVuZGVmaW5lZCBiZWZvcmUgYXNzaWduaW5nLCBzbyB0aGUgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB0eXBlIGhvbGRzIGF0IHJ1bnRpbWUgdG9vLlxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmIChjb25maWdLZXlzLmhhcyhrZXkpIHx8IGlzTm9uU2VjcmV0S2V5KGtleSkpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT09ICdEQVRBQkFTRV9VUkwnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpIGNvbnRpbnVlO1xuICAgIHNlY3JldHNba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBzZWNyZXRzO1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHNlY3JldCBuYW1lcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhlIGRlcGxveSB0YXJnZXQgV29ya2VyLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIHRoZSBXb3JrZXIgbm90IGV4aXN0aW5nIHlldCAoZmlyc3QgZGVwbG95KSwgc29cbiAqIHRoZSBjYWxsZXIgY2FuIGRlZ3JhZGUgdG8gdGhlIGxvY2FsLW9ubHkgbGltaXQgY2hlY2tzIGluc3RlYWQgb2YgYmxvY2tpbmcgYSBkZXBsb3kgdGhhdFxuICogd3JhbmdsZXIgaXRzZWxmIG1pZ2h0IGFjY2VwdC4gRmFpbGluZyBjbG9zZWQgaW5zdGVhZCB3b3VsZCB0dXJuIGV2ZXJ5IHRyYW5zaWVudCBsaXN0aW5nXG4gKiBmYWlsdXJlIChuZXR3b3JrLCBhIHRva2VuIHdpdGhvdXQgc2VjcmV0LXJlYWQgcGVybWlzc2lvbikgaW50byBhIGRlcGxveSBibG9ja2VyLCBhbmQg4oCUIHNpbmNlXG4gKiB3cmFuZ2xlciA0LnggcmVwb3J0cyBhIG1pc3NpbmcgV29ya2VyIG9ubHkgdmlhIGFuIGVycm9yLW1lc3NhZ2UgaGludCDigJQgYW55IHVucmVjb2duaXplZFxuICogbm90LWZvdW5kIHNoYXBlIHdvdWxkIHRoZW4gYmxvY2sgZmlyc3QgZGVwbG95cyBlbnRpcmVseTsgdGhpcyBwcmVmbGlnaHQgbXVzdCBvbmx5IGV2ZXIgYWRkXG4gKiBmYWlsdXJlcyB0aGF0IHdyYW5nbGVyIGl0c2VsZiB3b3VsZCByYWlzZSBhZnRlciB0aGUgbWlncmF0aW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFJlbW90ZVdvcmtlclNlY3JldE5hbWVzKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBEZXBsb3lDb21tYW5kQXJndixcbiAgd3JhbmdsZXJDb25maWdQYXRoOiBzdHJpbmcsXG4gIHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLFxuICBlbnZOYW1lOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgbGlzdEFyZ3MgPSBbXG4gICAgJ3NlY3JldCcsXG4gICAgJ2xpc3QnLFxuICAgICctLWZvcm1hdCcsXG4gICAgJ2pzb24nLFxuICAgICctLWNvbmZpZycsXG4gICAgd3JhbmdsZXJDb25maWdQYXRoLFxuICAgIC4uLihyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgXTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6IHdyYW5nbGVyICR7bGlzdEFyZ3Muam9pbignICcpfWApKTtcbiAgbGV0IHJldDtcbiAgdHJ5IHtcbiAgICByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKCd3cmFuZ2xlcicsIGxpc3RBcmdzLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYgYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgIGBGYWlsZWQgdG8gcnVuIHdyYW5nbGVyIHRvIGxpc3QgcmVtb3RlIHNlY3JldHM7IGNoZWNraW5nIG9ubHkgdGhlIGxvY2FsIHBheWxvYWQgYWdhaW5zdCBDbG91ZGZsYXJlJ3MgbGltaXRzLlxcbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHJldC5zdGF0dXMgPT09IDApIHtcbiAgICAvLyBDdXQgdGhlIEpTT04gYXJyYXkgb3V0IG9mIHRoZSBzdXJyb3VuZGluZyBvdXRwdXQ6IHdyYW5nbGVyIG1heSBwcmludCBpdHMgYmFubmVyIGFuZFxuICAgIC8vIFwiTXVsdGlwbGUgZW52aXJvbm1lbnRzXCIgd2FybmluZ3MgYXJvdW5kIHRoZSBwYXlsb2FkLlxuICAgIGNvbnN0IGpzb25TdGFydCA9IHJldC5zdGRvdXQuaW5kZXhPZignWycpO1xuICAgIGNvbnN0IGpzb25FbmQgPSByZXQuc3Rkb3V0Lmxhc3RJbmRleE9mKCddJyk7XG4gICAgaWYgKGpzb25TdGFydCAhPT0gLTEgJiYganNvbkVuZCAhPT0gLTEgJiYganNvblN0YXJ0IDwganNvbkVuZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyZXQuc3Rkb3V0LnNsaWNlKGpzb25TdGFydCwganNvbkVuZCArIDEpKSBhcyB7IG5hbWU/OiB1bmtub3duIH1bXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKS5maWx0ZXIoKG5hbWUpOiBuYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgd2FybmluZyBiZWxvdy5cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoL1xcW2NvZGU6IDEwMCgwN3w5MClcXF18SWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIvLnRlc3QocmV0LnN0ZG91dCArIHJldC5zdGRlcnIpKSB7XG4gICAgLy8gVGhlIFdvcmtlciBkb2VzIG5vdCBleGlzdCB5ZXQsIHNvIGEgZmlyc3QgZGVwbG95IGluaGVyaXRzIG5vdGhpbmcuIFdyYW5nbGVyIDQueCBjYXRjaGVzXG4gICAgLy8gdGhlIENsb3VkZmxhcmUgQVBJIGVycm9ycyAxMDAwNyAod29ya2Vycy5hcGkuZXJyb3Iuc2VydmljZV9ub3RfZm91bmQpIGFuZCAxMDA5MFxuICAgIC8vICh3b3JrZXJzLmFwaS5lcnJvci5zY3JpcHRfbm90X2ZvdW5kKSBhbmQgcmV0aHJvd3MgdGhlbSBhcyBhIFVzZXJFcnJvciBjb250YWluaW5nIHRoZVxuICAgIC8vICdJZiB0aGlzIGlzIGEgbmV3IFdvcmtlciwgcnVuIGB3cmFuZ2xlciBkZXBsb3lgIGZpcnN0JyBoaW50IHdpdGhvdXQgdGhlIG51bWVyaWMgY29kZSxcbiAgICAvLyBzbyBtYXRjaCBib3RoIHNoYXBlcy5cbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGNoYWxrLnllbGxvdyhcbiAgICAgIGBGYWlsZWQgdG8gbGlzdCB0aGUgcmVtb3RlIFdvcmtlciBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4keyhyZXQuc3RkZXJyIHx8IHJldC5zdGRvdXQpLnRyaW0oKX1gXG4gICAgKVxuICApO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlbW90ZSBzZWNyZXRzIHRoYXQgc3RheSBhdHRhY2hlZCB0byB0aGUgbmV3IHZlcnNpb246IGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzXG4gKiBhZGRpdGl2ZSwgc28gZXZlcnkgcmVtb3RlIHNlY3JldCB0aGUgb3V0Z29pbmcgcGF5bG9hZCBkb2VzIG5vdCBvdmVyd3JpdGUga2VlcHMgY291bnRpbmdcbiAqIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBsaW1pdCDigJQgZXhjZXB0IG5hbWVzIHRoYXQgYW4gZWZmZWN0aXZlIHZhciBvclxuICogYmluZGluZyByZXBsYWNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluaGVyaXRlZFJlbW90ZVNlY3JldE5hbWVzKFxuICByZW1vdGVTZWNyZXROYW1lczogc3RyaW5nW10sXG4gIG91dGdvaW5nU2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZWZmZWN0aXZlVmFyS2V5czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGJpbmRpbmdOYW1lczogcmVhZG9ubHkgc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVwbGFjZWROYW1lcyA9IG5ldyBTZXQoWy4uLmVmZmVjdGl2ZVZhcktleXMsIC4uLmJpbmRpbmdOYW1lc10pO1xuICByZXR1cm4gcmVtb3RlU2VjcmV0TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhT2JqZWN0Lmhhc093bihvdXRnb2luZ1NlY3JldHMsIG5hbWUpICYmICFyZXBsYWNlZE5hbWVzLmhhcyhuYW1lKSk7XG59XG5cbi8qKlxuICogUmVhZGluZyBiaW5FeGlzdHMgcHJlcGVuZHMgbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8gcHJvamVjdC5lbnYuUEFUSCxcbiAqIHNvIHRoZSBkaXJlY3QgKG5vbi1zaGVsbCkgd3JhbmdsZXIgc3Bhd25zIHJlc29sdmUgdGhlIGxvY2FsIGJpbmFyeS5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGlmICghcHJvamVjdC5iaW5FeGlzdHMpIHtcbiAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdub2RlX21vZHVsZXMvLmJpbiBub3QgZm91bmQ7IHJlbHlpbmcgb24gUEFUSCB0byByZXNvbHZlIHdyYW5nbGVyLicpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcywgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5pbnRlcmZhY2UgUGFyc2VkRG90ZW52QXJncyB7XG4gIGNvbW1hbmQ6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZEVudmlyb25tZW50IHtcbiAgY3dkOiBzdHJpbmc7XG4gIGVudjogTm9kZUpTLlByb2Nlc3NFbnY7XG59XG5cbmNvbnN0IHNodXRkb3duU2lnbmFscyA9IG5ldyBTZXQ8Tm9kZUpTLlNpZ25hbHM+KFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKTtcblxuZXhwb3J0IGNvbnN0IGRvdGVudkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdkb3RlbnYgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gZm5veCBhbmQgcnVuIGEgY29tbWFuZC4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+IHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQoZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5QYXJzZWREb3RlbnZDb21tYW5kKHsgY29tbWFuZCB9OiBQYXJzZWREb3RlbnZBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoY29tbWFuZCwgJ3diIGRvdGVudiAtLSA8Y29tbWFuZD4gW2FyZ3MuLi5dJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db21tYW5kV2l0aEVudmlyb25tZW50KFxuICBjb21tYW5kOiBzdHJpbmdbXSxcbiAgdXNhZ2U6IHN0cmluZyxcbiAgY29tbWFuZEVudmlyb25tZW50PzogQ29tbWFuZEVudmlyb25tZW50XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbW1hbmQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgVXNhZ2U6ICR7dXNhZ2V9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgY3dkID0gcGF0aC5yZXNvbHZlKGNvbW1hbmRFbnZpcm9ubWVudD8uY3dkID8/IHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBlbnYgPSBjb21tYW5kRW52aXJvbm1lbnQ/LmVudiA/PyBwcm9jZXNzLmVudjtcbiAgaWYgKCFjb21tYW5kRW52aXJvbm1lbnQpIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCk7XG4gIGNvbnN0IGJlcnJ5QmluRm9sZGVyUGF0aCA9IGVudi5CRVJSWV9CSU5fRk9MREVSO1xuICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52KTtcbiAgLy8gU3RyaXBwaW5nIHlhcm4ncyBlbnZpcm9ubWVudCBhbHNvIHJlbW92ZXMgaXRzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIOKAlCB0aGUgT05MWSBwbGFjZVxuICAvLyB5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyDigJQgc28gcmVzdG9yZSB0aGUgcHJvamVjdCdzIG93blxuICAvLyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBrZWVwIGJhcmUgYmluYXJ5IG5hbWVzIHJlc29sdmFibGUuIFBsdWcnbidQbGF5IGluc3RhbGxzXG4gIC8vIGNyZWF0ZSBubyBub2RlX21vZHVsZXMgYXQgYWxsOyB0aGUgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgaXMgdGhlbiB0aGUgc29sZSBzb3VyY2Ugb2ZcbiAgLy8gZGVwZW5kZW5jeSBleGVjdXRhYmxlcywgc28gcmVzdG9yZSBpdCBpbnN0ZWFkLlxuICAvLyBUaGUgdGVtcG9yYXJ5IGZvbGRlciBpcyBkZWxpYmVyYXRlbHkgTk9UIHJlc3RvcmVkIHdoZW4gLmJpbiBkaXJlY3RvcmllcyBleGlzdDogaXQgYWxzb1xuICAvLyBjb250YWlucyBub2RlL3lhcm4gc2hpbXMsIGFuZCBhIGxlYWtlZCBub2RlIHNoaW0gd291bGQgdmlvbGF0ZSB3YidzIHJlYWwtTm9kZSBndWFyYW50ZWVcbiAgLy8gZm9yIHRvb2xzIGxpa2Ugd3JhbmdsZXIvdmluZXh0LiBDaGlsZCBgeWFybmAgaW52b2NhdGlvbnMgc3RheSByZXNvbHZhYmxlIHRocm91Z2ggdGhlXG4gIC8vIGxhdW5jaGVyIG9uIHRoZSBiYXNlIFBBVEggKG1pc2UvY29yZXBhY2spLCB3aGljaCBldmVyeSBzdXBwb3J0ZWQgZW52aXJvbm1lbnQgaGFzIOKAlFxuICAvLyBub3RoaW5nIGNvdWxkIGhhdmUgc3RhcnRlZCBgeWFybiBydW5gL2B3YiBkb3RlbnZgIHdpdGhvdXQgaXQuXG4gIGlmICghcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGN3ZCwgZW52KSAmJiBiZXJyeUJpbkZvbGRlclBhdGgpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmVycnlCaW5Gb2xkZXJQYXRofToke2Vudi5QQVRIfWAgOiBiZXJyeUJpbkZvbGRlclBhdGg7XG4gIH1cblxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZFswXSEsIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjaGlsZC5raWxsKHNpZ25hbCk7XG4gICAgICB9O1xuICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICB9XG4gICAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IFtzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAvLyBSZS1yYWlzZSBldmVuIGZvciBmb3J3YXJkZWQgc2h1dGRvd24gc2lnbmFscyBzbyBjYWxsZXJzIG9ic2VydmUgdGhlIGNvbnZlbnRpb25hbFxuICAgICAgICAvLyBzaWduYWwgZXhpdCBzdGF0dXMgKGUuZy4gMTMwIGZvciBTSUdJTlQpIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIHN1Y2Nlc3MuXG4gICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGNvZGUgPz8gMTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZDogW1xuICAgICAgLi4uKChhcmd2LmFyZ3MgYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgICAuLi4oKGFyZ3ZbJy0tJ10gYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFuZGFyZFdiRW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZpeFRhcmdldDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChcbiAgICAhdmFsdWUgfHxcbiAgICBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10uaW5jbHVkZXModmFsdWUpIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgPT09ICcxJyB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZSdcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHt2YWx1ZX1cIi4gYCArXG4gICAgICBgRml4ICR7Zml4VGFyZ2V0fSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLmBcbiAgKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG4vLyBOT1RFOiBgd2IgZG90ZW52YCBkZWxpYmVyYXRlbHkgc2tpcHMgUHJvamVjdC5lbnYncyBmdWxsIHZhbGlkYXRpb246IGl0IGlzIGEgZ2VuZXJpYyBydW5uZXIgYWxzb1xuLy8gdXNlZCBiZWZvcmUgZW52IHNvdXJjZXMgZXhpc3QgKGJvb3RzdHJhcCkgYW5kIG11c3Qgbm90IGZhaWwgZmFzdCBmb3IgcmVwb3NpdG9yaWVzIHRoYXQgaGF2ZSBub3Rcbi8vIGFkb3B0ZWQgdGhlIG9yZyBlbnYgc3RhbmRhcmQuIEEgTk9OLUVNUFRZIFdCX0VOViBpcyBzdGlsbCB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgc3RhbmRhcmQgbW9kZXMsXG4vLyB0aG91Z2gg4oCUIGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCB3b3VsZCBvdGhlcndpc2Ugc2lsZW50bHkgc2VsZWN0IHRoZSBiYXNlIChkZXZlbG9wbWVudCkgdmFsdWVzLlxuZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gVGhlIG1vZGUgaXMgRk9SQ0VEIG9ubHkgd2hlbiBXQl9FTlYgaXMgZXhwbGljaXRseSBleHBvcnRlZDsgaXQgZHJpdmVzIHRoZSBmb3JjZWQtbW9kZSBvdmVycmlkZVxuICAvLyBiZWxvdyBhbmQgdGhlIHZhbGlkYXRpb24gYXQgdGhlIGVuZC5cbiAgY29uc3QgbW9kZSA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgLy8gVGhlIGZub3ggYC0tcHJvZmlsZWAgc2VsZWN0b3IsIGRlZmF1bHRpbmcgdG8gZGV2ZWxvcG1lbnQgbGlrZSB3YidzIG1haW4gbG9hZGVyIChgV0JfRU5WIHx8XG4gIC8vIE5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdgLCBzZWUgcmVhZEVudmlyb25tZW50VmFyaWFibGVzKSBzbyBhIHJlcG8ga2VlcGluZyBkZXYtb25seSBzZWNyZXRzXG4gIC8vIGluIGBbcHJvZmlsZXMuZGV2ZWxvcG1lbnQuc2VjcmV0c11gIGxvYWRzIHRoZW0gd2hlbiBXQl9FTlYgaXMgdW5zZXQgaW5zdGVhZCBvZiBvbmx5IHRoZSBiYXNlXG4gIC8vIHRhYmxlLiBJdCBhZGRpdGlvbmFsbHkgaG9ub3JzIGFuIGV4cGxpY2l0IEZOT1hfUFJPRklMRSwgYmVjYXVzZSBmbm94IGhvbm9ycyBpdCBhbmQgYHdiIGRvdGVudmBcbiAgLy8gd2l0aG91dCBXQl9FTlYgaXMgZG9jdW1lbnRlZCB0byBhcyB3ZWxsIChzZWUgcnVuRm5veEV4cG9ydCdzIGlnbm9yZVByb2ZpbGVFbnZWYXIgbm90ZSkuXG4gIC8vIE5PREVfRU5WIGlzIHJlYWQgdGhyb3VnaCB0aGUgYHJ1bnRpbWVFbnZgIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXJcbiAgLy8gZXhwcmVzc2lvbiB0aGF0IHRoZSBidW5kbGVyIGlubGluZXMgdG8gJ3Byb2R1Y3Rpb24nICh3aGljaCB3b3VsZCB3cm9uZ2x5IHNlbGVjdCBwcm9kdWN0aW9uKS5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBmbm94Q2FzY2FkZSA9IG1vZGUgfHwgcnVudGltZUVudi5GTk9YX1BST0ZJTEUgfHwgcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnO1xuICAvLyBXQl9FTlYgaW4gcHJvY2Vzcy5lbnYgbWVhbnMgdGhlIG1vZGUgaXMgZXhwbGljaXRseSBmb3JjZWQsIHNvIHZhbHVlcyBmcm9tIHRoZSBtb2RlJ3Mgb3duIGZub3hcbiAgLy8gcHJvZmlsZSB3aW4gb3ZlciB2YXJpYWJsZXMgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBzaGVsbCDigJQgZXhjZXB0IG9uIENJLCB3aGVyZSBpbmplY3RlZCBlbnZcbiAgLy8gdmFycyBtdXN0IGtlZXAgb3ZlcnJpZGluZyBjb21taXR0ZWQgdmFsdWVzXG4gIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTMwKS5cbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gISFtb2RlICYmICFpc0NJKHByb2Nlc3MuZW52LkNJKTtcbiAgY29uc3QgW3BhcnNlZF0gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgZm5veENhc2NhZGUsIHsgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52IH0pO1xuICAvLyBFeHBhbmQgJHsuLi59IHJlZmVyZW5jZXMgYWdhaW5zdCBleHBvcnRlZCB2YXJpYWJsZXMgd2hvc2UgZm5veCB2YWx1ZSBsb3NlcyB0byB0aGUgc2hlbGxcbiAgLy8gKG1pcnJvcmluZyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMnIGVmZmVjdGl2ZS12YWx1ZSBzZW1hbnRpY3MpOiBhIHJlZmVyZW5jZSBtdXN0IHJlc29sdmUgdG9cbiAgLy8gdGhlIHZhbHVlIHRoZSBjaGlsZCB3aWxsIGFjdHVhbGx5IHNlZS4gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyByZXR1cm5zIGFcbiAgLy8gcHJvY2Vzcy5lbnYtc2hhZG93ZWQga2V5IG9ubHkgd2hlbiB0aGUgZm9yY2VkIHByb2ZpbGUgb3ZlcnJpZGVzIGl0LCBzbyBldmVyeSBwYXJzZWQga2V5J3Mgb3duXG4gIC8vIHZhbHVlIHdpbnMgYW5kIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIHJlZmVyZW5jZSBzZXQuXG4gIGNvbnN0IHJlZmVyZW5jZUVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAvLyBFc2NhcGUgZG9sbGFyIHNpZ25zIHNvIGV4cG9ydGVkIHZhbHVlcyBzdWJzdGl0dXRlIGxpdGVyYWxseSAocGEkd29yZCBzdGF5cyBwYSR3b3JkKS5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBwYXJzZWQpKSB7XG4gICAgICByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbnZWYXJzID0gZXhwYW5kKHsgcGFyc2VkLCBwcm9jZXNzRW52OiByZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IHBhcnNlZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52W2tleV0gPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICAvLyBBIHByb2Nlc3MuZW52LXNoYWRvd2VkIGtleSByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSBmb3JjZWQgcHJvZmlsZSBvdmVycmlkZXMgaXQgKHNlZVxuICAgIC8vIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMpOyBvbiBDSSBzdWNoIGtleXMgYXJlIG5ldmVyIHJldHVybmVkLCBzbyBubyBicmFuY2ggaXMgbmVlZGVkLlxuICAgIGlmIChtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFdhcm5pbmc6ICR7a2V5fSBpbiB0aGUgXCIke21vZGV9XCIgbW9kZSdzIGVudiBzb3VyY2VzIG92ZXJyaWRlcyB0aGUgdmFsdWUgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBlbnZpcm9ubWVudCBiZWNhdXNlIFdCX0VOViBpcyBleHBsaWNpdGx5IHNldC5gXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBWYWxpZGF0ZSBvbmx5IEFGVEVSIGFwcGx5aW5nIHRoZSBzb3VyY2VzLCBzbyBhIFdCX1NLSVBfRU5WX0NIRUNLIGRlZmluZWQgaW4gYW4gZW52IFNPVVJDRSBpc1xuICAvLyBob25vcmVkOiBib3RoIHRoZSBjYXB0dXJlZCBleHBvcnRlZCBtb2RlIChpdCBzZWxlY3RlZCB0aGUgcHJvZmlsZSkgYW5kIHRoZSBGSU5BTCB2YWx1ZSB0aGVcbiAgLy8gY2hpbGQgd2lsbCBzZWUg4oCUIHRoZSBmbm94IHByb2ZpbGUgbWF5IGRlZmluZSBhIGJyb2tlbiBXQl9FTlYgKGUuZy4gYHByb2RjdXRpb25gKSwgYW5kIGEgZm9yY2VkXG4gIC8vIG1vZGUncyBwcm9maWxlIG1heSBldmVuIG92ZXJyaWRlIGEgVkFMSUQgZXhwb3J0ZWQgdmFsdWUuXG4gIHZhbGlkYXRlU3RhbmRhcmRXYkVudihtb2RlLCAndGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIHZhbGlkYXRlU3RhbmRhcmRXYkVudihwcm9jZXNzLmVudi5XQl9FTlYsICd0aGUgZW52IHNvdXJjZSBvciB0aGUgZXhwb3J0ZWQgdmFyaWFibGUnKTtcbiAgLy8gVGhlIHNlbGVjdGVkIGVudmlyb25tZW50IGlzIHdoYXQgYW4gZW52IHNvdXJjZSBzaWxlbnRseSByZXNvbHZpbmcgV0JfRU5WIHRvIGEgRElGRkVSRU5UIHZhbHVlXG4gIC8vIG11c3QgYWdyZWUgd2l0aCwgZWxzZSB0aGUgY2hpbGQgcnVucyBsYWJlbGVkIG9uZSBlbnZpcm9ubWVudCB3aGlsZSBjYXJyeWluZyBhbm90aGVyJ3Mgc2VjcmV0cy5cbiAgLy8gT25seSBhIFNUQU5EQVJEIGNhc2NhZGUgaXMgZW5mb3JjZWQgKG1pcnJvcmluZyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudik6IGEgY3VzdG9tXG4gIC8vIHNlbGVjdG9yIHN1Y2ggYXMgYE5PREVfRU5WPXFhYCBsZWdpdGltYXRlbHkgc2VsZWN0cyB0aGUgYHFhYCBwcm9maWxlIHdoaWxlIFdCX0VOViBzdGF5cyBhXG4gIC8vIHN0YW5kYXJkIG1vZGUuXG4gIGNvbnN0IGV4cGVjdGVkQ2FzY2FkZSA9IGZub3hDYXNjYWRlO1xuICBpZiAoXG4gICAgcHJvY2Vzcy5lbnYuV0JfRU5WICYmXG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKGV4cGVjdGVkQ2FzY2FkZSkgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9FTlYgIT09IGV4cGVjdGVkQ2FzY2FkZSAmJlxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLICE9PSAnMScgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJ3RydWUnXG4gICkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtwcm9jZXNzLmVudi5XQl9FTlZ9XCIgYWx0aG91Z2ggdGhlIFwiJHtleHBlY3RlZENhc2NhZGV9XCIgZW52aXJvbm1lbnQgd2FzIHNlbGVjdGVkLiBgICtcbiAgICAgICAgYEZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIGVudiBzb3VyY2VzLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suYFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IEZJTEVfU0NIRU1BLCBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIH0gZnJvbSAnLi9saXRlc3RyZWFtLmpzJztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXRNb3VudERpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnUFJJU01BIGdlbmVyYXRlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXRNb3VudERpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgJHt0aGlzLmdlbmVyYXRlKHByb2plY3QpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIHJldHVybiBzdGVwcy5maWx0ZXIoQm9vbGVhbikuam9pbignICYmICcpO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXRNb3VudERpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofSo7IGxpdGVzdHJlYW0gcmVzdG9yZSAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IC1vICR7b3V0cHV0UGF0aH0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBCbGl0eiBzZWVkIG1vZHVsZXMgZGVmYXVsdC1leHBvcnQgdGhlIHNlZWQgZnVuY3Rpb24gd2l0aG91dCBjYWxsaW5nIGl0LCBzbyBvbmx5XG4gICAgLy8gYGJsaXR6IGRiIHNlZWRgICh3aG9zZSBsb2FkZXIgaW52b2tlcyB0aGUgZXhwb3J0KSBhY3R1YWxseSBwb3B1bGF0ZXMgdGhlIGRhdGFiYXNlLlxuICAgIC8vIEJ1bi1lcmEgQmxpdHogcmVwb3NpdG9yaWVzIGRlY2xhcmUgcHJpc21hLnNlZWQgaW5zdGVhZCBhbmQgbXVzdCBhdm9pZCB0aGUgYmxpdHogQ0xJLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW5zaWRlIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuXG4gICAgaWYgKCFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2JsaXR6JykpIHtcbiAgICAgIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgfVxuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICBjb25zdCBzZWVkc1BhdGggPSBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L3NlZWRzLnRzYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCIke3NlZWRzUGF0aH1cIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gJHtzZWVkc1BhdGh9OyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbi8qKiBXaGVyZSB0aGUgTGl0ZXN0cmVhbS1yZXBsaWNhdGVkIFNRTGl0ZSBkYXRhYmFzZSBpcyBtb3VudGVkLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiBnZXRNb3VudERpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L21vdW50YDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFBPU1NJQkxFX1BSSVNNQV9QQVRIUy5maW5kKCh7IHNjaGVtYVBhdGggfSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpXG4gICAgPy5kYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXdEYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgeyBub3JtYWxpemVCdW5Mb2NrZmlsZSBhcyBub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbi8qKlxuICogU3RyaXAgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYGJ1bi5sb2NrYCBhbmQgcmVwb3J0IGEgY2hhbmdlLlxuICpcbiAqIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZSBjb25maWd1cmVkXG4gKiByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IG5hbWVkIGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpcyBleGFjdGx5IHdoYXRcbiAqIHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW55IGluc3RhbGwgcnVuIHdpdGggR3VhcmQgYXMgdGhlIERFRkFVTFQgcmVnaXN0cnkgKENJLCBvciBhXG4gKiBkZXZlbG9wZXIgd2hvIHB1dCBpdCBpbiB+Ly5ucG1yYykgYmFrZXMgbnBtLmZsYXR0LnRlY2ggVVJMcyBpbnRvIHRoZSBsb2NrZmlsZSwgYW5kIGNvbW1pdHRpbmdcbiAqIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5IGxhdGVyIGluc3RhbGwgZG93bmxvYWRzIHRocm91Z2hcbiAqIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGggNDAxIGZvciBhbnlvbmUgd2hvc2UgbnBtcmMgY2FycmllcyBhXG4gKiByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5J3MgY3JlZGVudGlhbHMgdG8gd2hhdGV2ZXIgaG9zdFxuICogdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlc2UgVVJMcyDigJQgd2l0aCBhbiBlbXB0eSBgcmVzb2x2ZWRgLCBidW5cbiAqIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tIHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5IOKAlCBzbyB0aGV5IGFyZSBwdXJlIGRhbWFnZS5cbiAqXG4gKiB3YmZ5IGdlbmVyYXRlcyBhIHByZS1jb21taXQgaG9vayB0aGF0IHN0cmlwcyB0aGUgc2FtZSBVUkxzLCBidXQgdGhhdCBvbmx5IGZpcmVzIGF0IGBnaXQgY29tbWl0YC5cbiAqIFJ1bm5pbmcgdGhpcyByaWdodCBhZnRlciBhbiBpbnN0YWxsIGNsb3NlcyB0aGUgd2luZG93IGluIGJldHdlZW4sIHdoZXJlIHRoZSByZXdyaXR0ZW4gbG9ja2ZpbGUgaXNcbiAqIHNpbXBseSB0aGUgd29ya2luZyB0cmVlJ3Mgc3RhdGU6IGEgYnlwYXNzZWQgaG9vaywgYSBjb21taXQgZnJvbSBhIHRvb2wgdGhhdCBkb2VzIG5vdCBydW4gaG9va3MsXG4gKiBvciBhIGRpZmYgcmVhZCBieSBhIGh1bWFuIG9yIGFuIGFnZW50IGFsbCBzZWUgaXQuIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ7IGEgc2NvcGVkXG4gKiByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplU2hhcmVkQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICBpZiAoIWxvY2tmaWxlUGF0aCkgcmV0dXJuO1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAke2xvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRvbWwgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hTZWNyZXRzVGFibGUge1xuICBba2V5TmFtZTogc3RyaW5nXTogdW5rbm93bjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRm5veENvbmZpZyB7XG4gIHJvb3Q/OiB1bmtub3duO1xuICBlbnY/OiB1bmtub3duO1xuICBkZWZhdWx0X3Byb3ZpZGVyPzogdW5rbm93bjtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgc2VjcmV0cz86IEZub3hTZWNyZXRzVGFibGU7XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgeyBzZWNyZXRzPzogRm5veFNlY3JldHNUYWJsZSB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLyoqXG4gKiBFdmVyeSBgZm5veC50b21sYCBmcm9tIGBwcm9qZWN0RGlyUGF0aGAgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIGByb290RGlyUGF0aGAsIG5lYXJlc3QgZmlyc3QuXG4gKiBBIGNvbmZpZyBkZWNsYXJpbmcgZm5veCdzIGByb290ID0gdHJ1ZWAgY2hhaW4gYm91bmRhcnkgZW5kcyB0aGUgd2FsaywgbWF0Y2hpbmcgZm5veCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQW5jZXN0b3JGbm94Q29uZmlnUGF0aHMocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKTtcbiAgZm9yIChsZXQgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyUGF0aCk7IDsgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKSkge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgICBjb25maWdQYXRocy5wdXNoKGNvbmZpZ1BhdGgpO1xuICAgICAgaWYgKHBhcnNlRm5veENvbmZpZyhjb25maWdQYXRoKS5yb290ID09PSB0cnVlKSBicmVhaztcbiAgICB9XG4gICAgLy8gU3RvcCBhdCB0aGUgcmVwb3NpdG9yeSByb290IChpdHMgcGFyZW50J3Mgc2VjcmV0cyBhcmUgbm90IHBhcnQgb2YgdGhpcyByZXBvKSBvciwgZGVmZW5zaXZlbHksXG4gICAgLy8gYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCB3aGVuIHJvb3REaXJQYXRoIGlzIG5vdCBhY3R1YWxseSBhbiBhbmNlc3Rvci5cbiAgICBpZiAoZGlyUGF0aCA9PT0gcm9vdFBhdGggfHwgcGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgfVxuICByZXR1cm4gY29uZmlnUGF0aHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZub3hDb25maWcoY29uZmlnUGF0aDogc3RyaW5nKTogRm5veENvbmZpZyB7XG4gIHJldHVybiBwYXJzZVRvbWwoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpIGFzIEZub3hDb25maWc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgdmFsdWVzIHRoYXQgYXJlIHNhZmUgdG8gYmFrZSBpbnRvIGEgRG9ja2VyIGltYWdlOiBvbmx5IGVudHJpZXMgd2hvc2UgRUZGRUNUSVZFXG4gKiBkZWZpbml0aW9uIChiYXNlIGBbc2VjcmV0c11gIG92ZXJsYWlkIGJ5IGBbcHJvZmlsZXMuPHByb2ZpbGVOYW1lPi5zZWNyZXRzXWAsIGFuY2VzdG9yIGNvbmZpZ3NcbiAqIG92ZXJsYWlkIGJ5IG5lYXJlciBvbmVzIOKAlCBmbm94J3Mgb3duIHByZWNlZGVuY2UpIGlzIGEgcGxhaW50ZXh0IGB7IGRlZmF1bHQgPSBcIi4uLlwiIH1gIHdpdGhvdXQgYVxuICogcHJvdmlkZXIuIFNlY3JldHMgbmV2ZXIgYXBwZWFyIGluIHRoZSByZXN1bHQsIGV2ZW4gd2hlbiBhIHBsYWludGV4dCBiYXNlIHZhbHVlIGlzIG92ZXJyaWRkZW4gYnlcbiAqIGFuIGVuY3J5cHRlZCBwcm9maWxlIHZhbHVlIChvciB2aWNlIHZlcnNhOiBhIHByb2ZpbGUgcGxhaW50ZXh0IG92ZXJyaWRlIG9mIGFuIGVuY3J5cHRlZCBiYXNlIElTXG4gKiByZXR1cm5lZCwgYmVjYXVzZSB0aGUgZWZmZWN0aXZlIGVudHJ5IGlzIHBsYWludGV4dCkuIE5lZWRzIG5vIGFnZSBrZXkgYW5kIG5ldmVyIGRlY3J5cHRzLlxuICpcbiAqIE9ubHkgdGhlIGNhbm9uaWNhbCB3YmZ5IGZub3gudG9tbCBsYXlvdXQgaXMgc3VwcG9ydGVkOiBmbm94IHNldHRpbmdzIHRoYXQgd291bGQgY2hhbmdlIHdoYXRcbiAqIGBmbm94IGV4cG9ydGAgeWllbGRzIHJlbGF0aXZlIHRvIHRoaXMgc3RhdGljIHJlYWRpbmcgKGEgdG9wLWxldmVsIGBlbnZgIG9yIGBkZWZhdWx0X3Byb3ZpZGVyYCxcbiAqIGBpbXBvcnRgLCBvciBhIHZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1Y2ggYXMgYGpzb25fcGF0aGAvYGxpbmVgL2Bhc19maWxlYCkgZmFpbCBmYXN0IGluc3RlYWQgb2ZcbiAqIHNpbGVudGx5IGJha2luZyB2YWx1ZXMgZm5veCB3b3VsZCBub3QgZXhwb3J0IGFzLWlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFBsYWludGV4dEZub3hWYWx1ZXMoXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHByb2ZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAvLyBSb290LW1vc3QgZmlyc3Qgc28gbmVhcmVyIGNvbmZpZ3Mgb3ZlcmxheSBhbmNlc3RvciB2YWx1ZXM7IHRoZSBwcm9maWxlIHRhYmxlIGFsd2F5cyBvdmVybGF5c1xuICAvLyB0aGUgYmFzZSB0YWJsZSwgbWF0Y2hpbmcgZm5veCdzIHByb2ZpbGUgcmVzb2x1dGlvbi5cbiAgY29uc3QgY29uZmlnUGF0aHMgPSBmaW5kQW5jZXN0b3JGbm94Q29uZmlnUGF0aHMocHJvamVjdERpclBhdGgsIHJvb3REaXJQYXRoKS50b1JldmVyc2VkKCk7XG4gIGNvbnN0IGNvbmZpZ3MgPSBjb25maWdQYXRocy5tYXAoKGNvbmZpZ1BhdGgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBwYXJzZUZub3hDb25maWcoY29uZmlnUGF0aCk7XG4gICAgZm9yIChjb25zdCBzZXR0aW5nTmFtZSBvZiBbJ2RlZmF1bHRfcHJvdmlkZXInLCAnZW52JywgJ2ltcG9ydCddIGFzIGNvbnN0KSB7XG4gICAgICBpZiAoY29uZmlnW3NldHRpbmdOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtjb25maWdQYXRofSB1c2VzIHRoZSB0b3AtbGV2ZWwgJHtzZXR0aW5nTmFtZX0gc2V0dGluZywgd2hpY2ggaXMgb3V0c2lkZSB0aGUgY2Fub25pY2FsIHdiZnkgZm5veC50b21sIGxheW91dDsgcmVtb3ZlIGl0IG9yIGtlZXAgc3VjaCB2YWx1ZXMgb3V0IG9mIHRoZSBEb2NrZXIgYmFrZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH0pO1xuICAvLyBOdWxsLXByb3RvdHlwZSByZWNvcmRzOiBmbm94IGFjY2VwdHMgYF9fcHJvdG9fX2AgYXMgYW4gb3JkaW5hcnkga2V5LCBhbmQgT2JqZWN0LmFzc2lnbiBvbiBhXG4gIC8vIGRlZmF1bHQtcHJvdG90eXBlIG9iamVjdCB3b3VsZCB0cmVhdCBpdCBhcyB0aGUgbGVnYWN5IHByb3RvdHlwZSBzZXR0ZXIgYW5kIGRyb3AgdGhlIGVudHJ5LlxuICBjb25zdCBlZmZlY3RpdmVFbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IE9iamVjdC5jcmVhdGUobnVsbCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIE9iamVjdC5hc3NpZ24oZWZmZWN0aXZlRW50cmllcywgY29uZmlnLnNlY3JldHMpO1xuICBpZiAocHJvZmlsZU5hbWUpIHtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSBPYmplY3QuYXNzaWduKGVmZmVjdGl2ZUVudHJpZXMsIGNvbmZpZy5wcm9maWxlcz8uW3Byb2ZpbGVOYW1lXT8uc2VjcmV0cyk7XG4gIH1cblxuICBjb25zdCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBPYmplY3QuY3JlYXRlKG51bGwpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGZvciAoY29uc3QgW2tleU5hbWUsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlZmZlY3RpdmVFbnRyaWVzKSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdvYmplY3QnIHx8IGVudHJ5ID09PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCB7XG4gICAgICBhc19maWxlLFxuICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlLFxuICAgICAgZW52LFxuICAgICAganNvbl9wYXRoLFxuICAgICAgbGluZSxcbiAgICAgIHByb3ZpZGVyLFxuICAgICAgdmFsdWUsXG4gICAgfSA9IGVudHJ5IGFzIHtcbiAgICAgIGFzX2ZpbGU/OiB1bmtub3duO1xuICAgICAgZGVmYXVsdD86IHVua25vd247XG4gICAgICBlbnY/OiB1bmtub3duO1xuICAgICAganNvbl9wYXRoPzogdW5rbm93bjtcbiAgICAgIGxpbmU/OiB1bmtub3duO1xuICAgICAgcHJvdmlkZXI/OiB1bmtub3duO1xuICAgICAgdmFsdWU/OiB1bmtub3duO1xuICAgIH07XG4gICAgLy8gU2tpcCBlbnRyaWVzIGZub3ggZG9lcyBub3QgZXhwb3J0IGFzIGVudmlyb25tZW50IHZhcmlhYmxlcywgbWF0Y2hpbmcgYGZub3ggZXhwb3J0YCdzIGRlZmF1bHQuXG4gICAgaWYgKGVudiA9PT0gZmFsc2UgfHwgZW52ID09PSAnZXhlYycpIGNvbnRpbnVlO1xuICAgIC8vIEEgYHZhbHVlYCBtYXJrcyBhIHByb3ZpZGVyLWJhY2tlZCAoZW5jcnlwdGVkKSBlbnRyeSBldmVuIGluIGV4b3RpYyBjb25maWdzOyBuZXZlciBiYWtlIGl0LlxuICAgIGlmIChwcm92aWRlciAhPT0gdW5kZWZpbmVkIHx8IHZhbHVlICE9PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGpzb25fcGF0aCAhPT0gdW5kZWZpbmVkIHx8IGxpbmUgIT09IHVuZGVmaW5lZCB8fCBhc19maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBlbnRyeSAke2tleU5hbWV9IHVzZXMgYSBmbm94IHZhbHVlIHRyYW5zZm9ybWF0aW9uIChqc29uX3BhdGgvbGluZS9hc19maWxlKSwgc28gaXRzIGV4cG9ydGVkIHZhbHVlIGRpZmZlcnMgZnJvbSBpdHMgcmF3IGRlZmF1bHQ7IGtlZXAgc3VjaCB2YWx1ZXMgb3V0IG9mIHRoZSBEb2NrZXIgYmFrZS5gXG4gICAgICApO1xuICAgIH1cbiAgICB2YWx1ZXNba2V5TmFtZV0gPSBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVQbGFpbnRleHRSZWZlcmVuY2VzKHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBgJHtOQU1FfWAgcmVmZXJlbmNlcyBiZXR3ZWVuIHBsYWludGV4dCB2YWx1ZXMgdGhlIHdheSBmbm94J3Mgb3duIGV4cG9ydCBkb2VzICh3YmZ5XG4gKiBleHBsaWNpdGx5IHRvbGVyYXRlcyBlLmcuIGBORVhUX1BVQkxJQ19XQl9FTlYgPSBcIiR7V0JfRU5WfVwiYCkuIEEgcmVmZXJlbmNlIHRvIGFueXRoaW5nIHRoYXQgaXNcbiAqIG5vdCBpdHNlbGYgYSBiYWtlYWJsZSBwbGFpbnRleHQgZW50cnkg4oCUIGEgc2VjcmV0LCBhbiB1bmRlY2xhcmVkIGtleSwgb3IgYSBjeWNsZSDigJQgZmFpbHMgZmFzdDpcbiAqIHJlc29sdmluZyBpdCB3b3VsZCBlaXRoZXIgcmVxdWlyZSBkZWNyeXB0aW9uIG9yIGRpdmVyZ2UgZnJvbSBgZm5veCBleHBvcnRgLiBCYXJlIGAkTkFNRWAgc3RheXNcbiAqIHVudG91Y2hlZCwgbWF0Y2hpbmcgZm5veCwgYW5kIGlzIHJlamVjdGVkIGxhdGVyIGJ5IHRoZSBzZXJpYWxpemVyIGJlY2F1c2UgZG90ZW52LWV4cGFuZC1zdHlsZVxuICogY29uc3VtZXJzIHdvdWxkIHJlc29sdmUgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQbGFpbnRleHRSZWZlcmVuY2VzKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXNvbHZlZFZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IE9iamVjdC5jcmVhdGUobnVsbCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVzb2x2ZSA9IChrZXlOYW1lOiBzdHJpbmcsIHJhd1ZhbHVlOiBzdHJpbmcsIHN0YWNrOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVzb2x2ZWRWYWx1ZXNba2V5TmFtZV07XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGlmIChzdGFjay5pbmNsdWRlcyhrZXlOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZW50cmllcyAke1suLi5zdGFjaywga2V5TmFtZV0uam9pbignIC0+ICcpfSBmb3JtIGEgcmVmZXJlbmNlIGN5Y2xlIGluIGZub3gudG9tbC5gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByYXdWYWx1ZS5yZXBsYWNlQWxsKC9cXCRcXHsoW0EtWmEtel9dXFx3KilcXH0vZywgKF8sIHJlZmVyZW5jZWRLZXlOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZWRSYXdWYWx1ZSA9IHZhbHVlc1tyZWZlcmVuY2VkS2V5TmFtZV07XG4gICAgICBpZiAocmVmZXJlbmNlZFJhd1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgdmFsdWUgb2YgJHtrZXlOYW1lfSByZWZlcmVuY2VzICR7cmVmZXJlbmNlZEtleU5hbWV9LCB3aGljaCBpcyBub3QgYSBiYWtlYWJsZSBwbGFpbnRleHQgZm5veCBlbnRyeTsgb25seSBwbGFpbnRleHQtdG8tcGxhaW50ZXh0IHJlZmVyZW5jZXMgY2FuIGJlIGJha2VkIGludG8gYSBEb2NrZXIgaW1hZ2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmUocmVmZXJlbmNlZEtleU5hbWUsIHJlZmVyZW5jZWRSYXdWYWx1ZSwgWy4uLnN0YWNrLCBrZXlOYW1lXSk7XG4gICAgfSk7XG4gICAgcmVzb2x2ZWRWYWx1ZXNba2V5TmFtZV0gPSByZXNvbHZlZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH07XG4gIGZvciAoY29uc3QgW2tleU5hbWUsIHJhd1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZXMpKSByZXNvbHZlKGtleU5hbWUsIHJhd1ZhbHVlLCBbXSk7XG4gIHJldHVybiByZXNvbHZlZFZhbHVlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmltcG9ydCB0eXBlIHsgRm5veFNlY3JldHNUYWJsZSB9IGZyb20gJy4vZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZmluZEFuY2VzdG9yRm5veENvbmZpZ1BhdGhzLCBwYXJzZUZub3hDb25maWcgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcblxuLyoqXG4gKiBXcml0ZSB0aGUga2V5LW9ubHkgc3R1YiB0aGF0IGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCByZWFkcyB0byB0eXBlIHRoZSBDbG91ZGZsYXJlIGBFbnZgLlxuICpcbiAqIGB3cmFuZ2xlciB0eXBlc2AgZGVyaXZlcyBlYWNoIGBFbnZgIG1lbWJlciBmcm9tIGEga2V5J3MgbWVyZSBwcmVzZW5jZSBpbiB0aGUgZmlsZSDigJQgbmV2ZXIgZnJvbSBpdHNcbiAqIHZhbHVlLCBhbmQgbmV2ZXIgZnJvbSBwcm9jZXNzLmVudiDigJQgYW5kIGAtLWVudi1maWxlYCBSRVBMQUNFUyB3cmFuZ2xlcidzIG5hdGl2ZSBgLmVudmAvYC5kZXYudmFyc2BcbiAqIHJlYWRpbmcuIFRoZSBzdHViIHRoZXJlZm9yZSBjYXJyaWVzIGV2ZXJ5IGRlY2xhcmVkIGJpbmRpbmcga2V5IHdpdGggYSBjb25zdGFudCBwbGFjZWhvbGRlciB2YWx1ZVxuICogKGAxYCwgbm90IGVtcHR5LCBzbyBpdCBjYW5ub3Qgb3ZlcnJpZGUgYSB3cmFuZ2xlciBgdmFyc2AgYmluZGluZyB3aXRoIGFuIGVtcHR5IHN0cmluZykuIEl0IHdyaXRlcyBub1xuICogcmVhbCBzZWNyZXQgYW5kIG5lZWRzIG5vIGRlY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVdvcmtlclR5cGVzRW52U3R1Yihwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qga2V5TmFtZXMgPSBjb2xsZWN0V29ya2VyQmluZGluZ0tleU5hbWVzKHByb2plY3REaXJQYXRoLCByb290RGlyUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIG91dHB1dFBhdGgsXG4gICAga2V5TmFtZXMubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfT0xYCkuam9pbignXFxuJykgKyAoa2V5TmFtZXMubGVuZ3RoID4gMCA/ICdcXG4nIDogJycpXG4gICk7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgR2VuZXJhdGVkICR7b3V0cHV0UGF0aH0gd2l0aCAke2tleU5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuYCkpO1xufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlIGRlY2xhcmVkIFdvcmtlciBiaW5kaW5nIGtleSBOQU1FUyBmcm9tIHRoZSBjb21taXR0ZWQgYGZub3gudG9tbGAgZmlsZXMgd2l0aG91dFxuICogZGVjcnlwdGluZyBhbnl0aGluZyBvciBpbnZva2luZyB0aGUgZW52aXJvbm1lbnQgcmVhZGVyLiBUaGlzIGRlbGliZXJhdGVseSBhdm9pZHMgcHJvY2Vzcy5lbnYsXG4gKiBgbWlzZSBlbnZgIGhvc3QvdG9vbCB2YXJpYWJsZXMsIGFuZCBjYXNjYWRlL3Byb2ZpbGUgc2VsZWN0aW9uLCBhbGwgb2Ygd2hpY2ggd291bGQgb3RoZXJ3aXNlXG4gKiBwb2xsdXRlIG9yIG5hcnJvdyB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFdvcmtlckJpbmRpbmdLZXlOYW1lcyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBmbm94IG1lcmdlcyB0aGUgd2hvbGUgYW5jZXN0b3IgY29uZmlnIGNoYWluIChhIG5lc3RlZCBXb3JrZXIgaW5oZXJpdHMgdGhlIG1vbm9yZXBvIHJvb3Qnc1xuICAvLyBzZWNyZXRzKSwgc28gdW5pb24gZXZlcnkgZm5veC50b21sIGZyb20gdGhlIHByb2plY3QgZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuXG4gIGZvciAoY29uc3QgY29uZmlnUGF0aCBvZiBmaW5kQW5jZXN0b3JGbm94Q29uZmlnUGF0aHMocHJvamVjdERpclBhdGgsIHJvb3REaXJQYXRoKSkge1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBwYXJzZUZub3hTZWNyZXRLZXlOYW1lcyhjb25maWdQYXRoKSkga2V5TmFtZXMuYWRkKGtleU5hbWUpO1xuICB9XG4gIHJldHVybiBbLi4ua2V5TmFtZXNdLnRvU29ydGVkKChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBrZXkgbmFtZXMgdW5kZXIgYGZub3gudG9tbGAncyBgW3NlY3JldHNdYCBhbmQgZXZlcnkgYFtwcm9maWxlcy48bmFtZT4uc2VjcmV0c11gIHRhYmxlLlxuICogZm5veCBzdG9yZXMga2V5IG5hbWVzIGluIHBsYWludGV4dCAob25seSB2YWx1ZXMgYXJlIGVuY3J5cHRlZCksIHNvIHRoaXMgbmVlZHMgbm8gYWdlIGtleS4gRXZlcnlcbiAqIHByb2ZpbGUncyBzZWNyZXRzIGFyZSB1bmlvbmVkIHNvIHRoZSBFbnYgaXMgYSBkZXRlcm1pbmlzdGljIHN1cGVyc2V0IGNvdmVyaW5nIGFsbCBlbnZpcm9ubWVudHNcbiAqIChsaWtlIHRoZSBmb3JtZXIgY29tbWl0dGVkIC5lbnYuZXhhbXBsZSksIGluZGVwZW5kZW50IG9mIHRoZSBwcm9maWxlIGEgZ2l2ZW4gcnVuIHJlc29sdmVzLlxuICovXG5mdW5jdGlvbiBwYXJzZUZub3hTZWNyZXRLZXlOYW1lcyhjb25maWdQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbmZpZyA9IHBhcnNlRm5veENvbmZpZyhjb25maWdQYXRoKTtcbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNvbGxlY3QgPSAoc2VjcmV0czogRm5veFNlY3JldHNUYWJsZSB8IHVuZGVmaW5lZCk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgW2tleU5hbWUsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzID8/IHt9KSkge1xuICAgICAgLy8gU2tpcCBzZWNyZXRzIGZub3ggZG9lcyBub3QgZXhwb3J0IGFzIGVudmlyb25tZW50IHZhcmlhYmxlcyAoYGVudiA9IGZhbHNlYCAvIGBcImV4ZWNcImApOiB0aGV5XG4gICAgICAvLyBhcmUgbmV2ZXIgV29ya2VyIGJpbmRpbmdzLCBtYXRjaGluZyBgZm5veCBleHBvcnRgJ3MgZGVmYXVsdC5cbiAgICAgIGNvbnN0IGVudiA9IHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgPyAoZW50cnkgYXMgeyBlbnY/OiB1bmtub3duIH0pLmVudiA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbnYgPT09IGZhbHNlIHx8IGVudiA9PT0gJ2V4ZWMnKSBjb250aW51ZTtcbiAgICAgIGtleU5hbWVzLnB1c2goa2V5TmFtZSk7XG4gICAgfVxuICB9O1xuICBjb2xsZWN0KGNvbmZpZy5zZWNyZXRzKTtcbiAgZm9yIChjb25zdCBwcm9maWxlIG9mIE9iamVjdC52YWx1ZXMoY29uZmlnLnByb2ZpbGVzID8/IHt9KSkgY29sbGVjdChwcm9maWxlPy5zZWNyZXRzKTtcbiAgcmV0dXJuIGtleU5hbWVzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRHJpenpsZUNvbmZpZywgd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnLi4vdXRpbHMvYnVuTG9ja2ZpbGUuanMnO1xuaW1wb3J0IHsgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIgfSBmcm9tICcuLi91dGlscy93b3JrZXJUeXBlc0Vudi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuLy8gYHdyYW5nbGVyIHR5cGVzYCBkZXJpdmVzIHRoZSBDbG91ZGZsYXJlIGBFbnZgJ3Mgc2VjcmV0L3ZhciBtZW1iZXJzIG9ubHkgZnJvbSB0aGUgS0VZIE5BTUVTIGluIGFcbi8vIC5kZXYudmFycy8uZW52IGZpbGUgKG5ldmVyIGZyb20gcHJvY2Vzcy5lbnYpLCBhbmQgYC0tZW52LWZpbGVgIFJFUExBQ0VTIHRoYXQgZGVmYXVsdCBmaWxlIHNldC4gU29cbi8vIGdlbi1jb2RlIHR5cGVzIGEgV29ya2VyIGFnYWluc3QgYSB0aHJvd2F3YXkga2V5LW9ubHkgc3R1YiB3cml0dGVuIGhlcmUgZnJvbSBjb21taXR0ZWQgc291cmNlcy5cbmNvbnN0IHdvcmtlclR5cGVzRW52UGF0aCA9IHBhdGguam9pbignLndyYW5nbGVyJywgJ3dvcmtlci10eXBlcy5lbnYnKTtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIEJlZm9yZSB0aGUgZWFybHkgcmV0dXJuIGJlbG93OiBgZ2VuLWNvZGVgIGlzIHRoZSBgcG9zdGluc3RhbGxgIHNjcmlwdCB3YmZ5IGdlbmVyYXRlcywgbWFraW5nXG4gICAgLy8gdGhpcyB0aGUgZmlyc3Qgd2IgY29kZSB0aGF0IHJ1bnMgYWZ0ZXIgYnVuIG1heSBoYXZlIHJld3JpdHRlbiB0aGUgbG9ja2ZpbGUsIGFuZCBhIHJlcG9zaXRvcnlcbiAgICAvLyB3aXRoIG5vdGhpbmcgdG8gZ2VuZXJhdGUgbmVlZHMgdGhlIG5vcm1hbGl6YXRpb24ganVzdCBhcyBtdWNoLiBgcm9vdERpclBhdGhgIHJhdGhlciB0aGFuXG4gICAgLy8gYHByb2plY3RzLnJvb3QuZGlyUGF0aGA6IGJ1biBydW5zIGEgd29ya3NwYWNlIHBhY2thZ2UncyBwb3N0aW5zdGFsbCBmcm9tIHRoYXQgcGFja2FnZSdzXG4gICAgLy8gZGlyZWN0b3J5LCBhbmQgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMgb25seSBjbGltYnMgb3V0IG9mIGBwYWNrYWdlcy8qYCwgc28gYSB3b3Jrc3BhY2Ugc3VjaFxuICAgIC8vIGFzIGBhcHBzL3dlYmAgd291bGQgb3RoZXJ3aXNlIGxvb2sgZm9yIGBhcHBzL3dlYi9idW4ubG9ja2AgaW5zdGVhZCBvZiB0aGUgcmVwb3NpdG9yeSdzLlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHByb2plY3RzLnNlbGYucm9vdERpclBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgLy8gV3JpdGUgdGhlIGtleSBzdHViIHRoZSBmaXJzdCBzY3JpcHQncyBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgY29uc3VtZXMuIEl0IGlzIGRlcml2ZWQgZnJvbVxuICAgICAgLy8gY29tbWl0dGVkIHNvdXJjZXMgKGZub3gudG9tbCBrZXkgbmFtZXMpLCBzbyBpdCBuZWVkcyBubyBhZ2Uga2V5LCBuZXZlciBwdWxscyBpblxuICAgICAgLy8gcHJvY2Vzcy5lbnYgLyBgbWlzZSBlbnZgIGhvc3QgdmFyaWFibGVzLCBhbmQgZG9lcyBub3QgZGVwZW5kIG9uIHdoaWNoIHByb2ZpbGUgYSBydW4gcmVzb2x2ZXMuXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmIGdldFdyYW5nbGVyVHlwZXNTY3JpcHQocHJvamVjdCkpIHtcbiAgICAgICAgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIoXG4gICAgICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgIHByb2plY3Qucm9vdERpclBhdGgsXG4gICAgICAgICAgcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgd29ya2VyVHlwZXNFbnZQYXRoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgLy8gRmlyc3Q6IGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBpcyBnaXRpZ25vcmVkLCBzbyBvbiBhIGZyZXNoIGNoZWNrb3V0IGl0IGRvZXMgbm90IGV4aXN0IHlldCxcbiAgLy8gYW5kIHRoZSBnZW5lcmF0b3JzIGJlbG93IHR5cGUtY2hlY2sgYWdhaW5zdCB0aGUgQ2xvdWRmbGFyZSBgRW52YCBpdCBkZWNsYXJlcy5cbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1NjcmlwdCA9IGdldFdyYW5nbGVyVHlwZXNTY3JpcHQocHJvamVjdCk7XG4gIGlmICh3cmFuZ2xlclR5cGVzU2NyaXB0KSB7XG4gICAgLy8gYC0tZW52LWZpbGVgIHBvaW50cyB3cmFuZ2xlciBhdCB0aGUga2V5IHN0dWIgdGhlIGhhbmRsZXIgd3JpdGVzIChzZWUgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLFxuICAgIC8vIHNvIGEgZnJlc2ggY2hlY2tvdXQgd2l0aCBubyBydW50aW1lIC5kZXYudmFycyAoZS5nLiBDSSkgc3RpbGwgdHlwZXMgZXZlcnkgc2VjcmV0LiBXaXRob3V0IGl0IGFcbiAgICAvLyBiYXJlIGB3cmFuZ2xlciB0eXBlc2AgeWllbGRzIGFuIGBFbnZgIG1pc3NpbmcgZXZlcnkgc2VjcmV0IGFuZCB0aGUgdHlwZS1hd2FyZSBnZW5lcmF0b3JzL2xpbnRlcnNcbiAgICAvLyBiZWxvdyBmYWlsIChlLmcuIFwiUHJvcGVydHkgJ0FVVEhfU0VDUkVUJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdFbnYnXCIpLlxuICAgIHNjcmlwdHMucHVzaChgJHt3cmFuZ2xlclR5cGVzU2NyaXB0fSAtLWVudi1maWxlICR7d29ya2VyVHlwZXNFbnZQYXRofWApO1xuICB9XG4gIC8vIFlhcm4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBuZWVkIGBibGl0eiBjb2RlZ2VuYCBmb3IgdGhlIHJvdXRlIG1hbmlmZXN0IChub2RlX21vZHVsZXMvLmJsaXR6KVxuICAvLyB0aGF0IEBibGl0empzL25leHQncyB0eXBlIGRlY2xhcmF0aW9ucyByZS1leHBvcnQ7IGluc3RhbGwgc2NyaXB0cyBkbyBub3QgcnVuIGl0XG4gIC8vIChlbmFibGVTY3JpcHRzOiBmYWxzZSkuIE5ldmVyIHVuZGVyIEJ1bjogdGhlIGJsaXR6IENMSSBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluXG4gIC8vIHBsYWNlLCB3aGljaCBtdXN0IG5vdCBoYXBwZW4gaW4gQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZSAoQnVuLWVyYSBCbGl0eiByZXBvc2l0b3JpZXMgZ2VuZXJhdGVcbiAgLy8gdGhlIG1hbmlmZXN0IHdpdGggdGhlaXIgb3duIHNjcmlwdHMgaW5zdGVhZCkuIE9uIGEgZnJlc2ggaW5zdGFsbCBgYmxpdHogY29kZWdlbmAgYWxzb1xuICAvLyBnZW5lcmF0ZXMgdGhlIFByaXNtYSBjbGllbnQgaXRzZWxmLCBtYWtpbmcgdGhlIFBSSVNNQSBnZW5lcmF0ZSBzdGVwIGJlbG93IHJlZHVuZGFudCBvbmNlIOKAlFxuICAvLyBrZWVwaW5nIGJvdGggaXMgZGVsaWJlcmF0ZTogYWZ0ZXIgc2NoZW1hLW9ubHkgY2hhbmdlcyBibGl0eidzIGFscmVhZHktZ2VuZXJhdGVkIGd1YXJkIHNraXBzXG4gIC8vIGl0cyBpbnRlcm5hbCBnZW5lcmF0ZSwgc28gdGhlIGV4cGxpY2l0IHN0ZXAgaXMgc3RpbGwgd2hhdCByZWdlbmVyYXRlcyB0aGUgY2xpZW50LlxuICBpZiAoIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnYmxpdHonKSAmJiBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICBzY3JpcHRzLnB1c2goJ1lBUk4gYmxpdHogY29kZWdlbicpO1xuICB9XG4gIGNvbnN0IHByaXNtYUdlbmVyYXRlU2NyaXB0ID0gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdCk7XG4gIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gIH1cbiAgY29uc3QgY2hha3JhVHlwZWdlblNjcmlwdCA9IGdldENoYWtyYVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGNoYWtyYVR5cGVnZW5TY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goY2hha3JhVHlwZWdlblNjcmlwdCk7XG4gIH1cbiAgY29uc3QgZHJpenpsZUNoZWNrU2NyaXB0ID0gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZHJpenpsZUNoZWNrU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGRyaXp6bGVDaGVja1NjcmlwdCk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzU2NyaXB0ID0gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZ2VuSTE4blRzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGdlbkkxOG5Uc1NjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8qKlxuICogYFlBUk4gd3JhbmdsZXJgIHJhdGhlciB0aGFuIGBidW54IHdyYW5nbGVyYDogd3JhbmdsZXIgbmVlZHMgcmVhbCBOb2RlLmpzLCBhbmQgYGJ1bnhgIG1heSByZXNvbHZlXG4gKiBhIHZlcnNpb24gb3RoZXIgdGhhbiB0aGUgbG9ja2ZpbGUncy4gUmV0dXJucyB0aGUgYmFzZSBjb21tYW5kOyB0aGUgY2FsbGVyIGFwcGVuZHMgYC0tZW52LWZpbGVgXG4gKiBwb2ludGluZyBhdCBhIGdlbmVyYXRlZCBrZXktb25seSBzdHViIChzZWUgZ2V0R2VuQ29kZVNjcmlwdHMpIGJlY2F1c2UgZm5veCByZXBvc2l0b3JpZXMgaGF2ZSBub1xuICogYC5lbnZgIGZpbGUgZm9yIHdyYW5nbGVyIHRvIGluZmVyIHRoZSBzZWNyZXQgYmluZGluZ3MgZnJvbS4gYC0tc3RyaWN0LXZhcnNgIGlzIGRlbGliZXJhdGVseSBsZWZ0XG4gKiBvdXQg4oCUIGl0IGlzIGEgcGVyLXJlcG9zaXRvcnkgdHlwZS1zdHJpY3RuZXNzIGNob2ljZSB0aGF0IGJlbG9uZ3MgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0LmdlbmVyYXRlc1dvcmtlclR5cGVzKSByZXR1cm47XG4gIHJldHVybiAnWUFSTiB3cmFuZ2xlciB0eXBlcyc7XG59XG5cbmZ1bmN0aW9uIGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSB7XG4gICAgaWYgKCFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHJldHVybjtcbiAgICByZXR1cm4gJ1lBUk4gcnVuIGdlbi1pMThuLXRzJztcbiAgfVxuICBpZiAoXG4gICAgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdnZW4taTE4bi10cycpICYmXG4gICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnaTE4bicpKVxuICApIHtcbiAgICByZXR1cm4gJ1lBUk4gZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzUHJpc21hKSByZXR1cm47XG4gIGlmICghaGFzUHJpc21hU2NoZW1hKHByb2plY3QpKSByZXR1cm47XG4gIHJldHVybiBwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGFrcmFTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdAY2hha3JhLXVpL2NsaScpKSByZXR1cm47XG4gIGlmICghZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIGNoYWtyYSB0eXBlZ2VuIHNyYy90aGVtZS50cyAtLXN0cmljdCc7XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybjtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm47XG4gIC8vIEtlZXAgdGhlIGV4cGxpY2l0IC0tY29uZmlnIGJlY2F1c2UgZHJpenpsZS1raXQncyBkZWZhdWx0IGxvb2t1cCBtaXNzZXMgc29tZSBleHRlbnNpb25zIChlLmcuIC5tdHMpLlxuICByZXR1cm4gYCR7d3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7Y29uZmlnLmZpbGVOYW1lfWApfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhc1ByaXNtYVNjaGVtYShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3ByaXNtYS9zY2hlbWEucHJpc21hJywgJ3ByaXNtYS9zY2hlbWEnLCAnZGIvc2NoZW1hLnByaXNtYSddLnNvbWUoKGZpbGVQYXRoKSA9PlxuICAgIGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VEb3RlbnYgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGRvbid0IHNlZSB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudDsgd3JhbmdsZXIgZGV2IHJlYWRzIHZhcnMgZnJvbSBhIC5kZXYudmFyc1xuLy8gZmlsZSBuZXh0IHRvIGl0cyBjb25maWcgZmlsZSBpbnN0ZWFkLiBUaGlzIGNvbW1hbmQgYnJpZGdlcyB0aGUgZm5veC1tYW5hZ2VkIHZhbHVlcyB0byB0aGF0IGZpbGUuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIEdlbkRldlZhcnNDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgJiB7IHBhdGg/OiBzdHJpbmcgfT47XG5cbmV4cG9ydCBjb25zdCBnZW5EZXZWYXJzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZ2VuLWRldi12YXJzIFtwYXRoXScsXG4gIGRlc2NyaWJlOlxuICAgICdHZW5lcmF0ZSBhIC5kZXYudmFycyBmaWxlIGZvciBgd3JhbmdsZXIgZGV2YCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbG9hZGVkIGZyb20gZm5veCAocGx1cyBXQl9FTlYgYW5kIE5FWFRfUFVCTElDX1dCX0VOVikuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PlxuICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGgnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgLmRldi52YXJzIGZpbGUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJy5kZXYudmFycycsXG4gICAgfSkgYXMgdW5rbm93biBhcyBBcmd2PEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogR2VuRGV2VmFyc0NvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgbG9hZGVkIGZyb20gdGhlIHByb2plY3QncyBkZWNsYXJlZCBlbnZpcm9ubWVudCBzb3VyY2VzIHNvIHRoYXRcbiAgICAvLyB1bnJlbGF0ZWQgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmV2ZXIgbGVhayBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gSWdub3JlXG4gICAgLy8gcHJvY2Vzcy5lbnYgYmVjYXVzZSB0aGUgcGFyZW50IHdiIHByb2Nlc3MgaW5qZWN0cyB0aGUgZm5veCB2YWx1ZXMgaW50byBpdCwgd2hpY2ggd291bGRcbiAgICAvLyBvdGhlcndpc2Ugc3VwcHJlc3MgbG9hZGluZyB0aGVtIGhlcmUuIHdiZnkgZGVjbGFyZXMgdGhlIFdCX0VOVi1mYW1pbHkga2V5cyBpbiBmbm94LCBzb1xuICAgIC8vIHRoZXkgYXJlIGFscmVhZHkgaW5jbHVkZWQ7IHByb2Nlc3Mtb25seSBrZXlzIGFyZSBpbnRlbnRpb25hbGx5IG91dHNpZGUgdGhpcyBhbGxvd2xpc3QuXG4gICAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZm5veCB2YWx1ZXMgZm9yIGNvbmZpZ3VyZWQga2V5c1xuICAgIC8vIChwcm9qZWN0LmVudiBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2Igc3RhcnRgIHdvdWxkIHNlcnZlIHRoZVxuICAgIC8vIHN0YWxlIGNvbmZpZ3VyZWQgdmFsdWUuIEFuIGV4cG9ydCB0aGF0IGVtcHRpZXMgYSBub24tZW1wdHkgY29uZmlndXJlZCB2YWx1ZSBpcyBkZWxpYmVyYXRlXG4gICAgLy8gYW5kIG11c3Qgc3Vydml2ZSB0aGUgZW1wdHktdmFsdWUgZmlsdGVyIGJlbG93ICh1bmxpa2UgYEtFWT1gIHBsYWNlaG9sZGVycywgd2hpY2ggc3RheVxuICAgIC8vIG9taXR0ZWQgc28gdGhleSBjYW5ub3Qgb3ZlcnJpZGUgd3JhbmdsZXIgYHZhcnNgIHdpdGggZW1wdHkgc3RyaW5ncykuXG4gICAgY29uc3QgZXhwbGljaXRseUVtcHRpZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSA9PT0gJycgJiYgZW52VmFyc1trZXldICE9PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgIT09ICcnIHx8IGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3F1b3RlRG90ZW52VmFsdWUoa2V5LCB2YWx1ZSl9YCk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGFyZ3YucGF0aCA/PyAnLmRldi52YXJzJyk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgV291bGQgZ2VuZXJhdGUgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuYCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJyk7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuYCkpO1xuICB9LFxufTtcblxuLyoqXG4gKiBRdW90ZSBhIHZhbHVlIGZvciBkb3RlbnYgKHdoaWNoIHdyYW5nbGVyIHVzZXMgZm9yIC5kZXYudmFycykuIEV2ZXJ5IGNhbmRpZGF0ZSByZXByZXNlbnRhdGlvblxuICogaXMgdmVyaWZpZWQgYnkgYWN0dWFsbHkgcGFyc2luZyBpdCBiYWNrIChvdXIgZG90ZW52IHBhcnNlciBtYXRjaGVzIHdyYW5nbGVyJ3MgYnVuZGxlZCBkb3RlbnZcbiAqIDE2IGZvciB0aGVzZSBjb25zdHJ1Y3RzKSwgc28gYSB2YWx1ZSBpcyBlaXRoZXIgc2VyaWFsaXplZCBsb3NzbGVzc2x5IG9yIHJlamVjdGVkIOKAlCBuZXZlclxuICogc2lsZW50bHkgY29ycnVwdGVkLiBDYW5kaWRhdGVzOiBzaW5nbGUgcXVvdGVzIChsaXRlcmFsIHNwYW47IGNsb3NlZCBlYXJseSBieSBhbiBhcG9zdHJvcGhlKSxcbiAqIGJhY2t0aWNrcyAoZXF1YWxseSBsaXRlcmFsKSwgdGhlbiBkb3VibGUgcXVvdGVzIHdpdGggZXNjYXBlZCBuZXdsaW5lcy9DUnMgKGRvdGVudiBkb2VzIG5vdFxuICogdW5lc2NhcGUgaW5uZXIgXFxcIiDigJQgYSBgI2AgYWZ0ZXIgYW4gZW1iZWRkZWQgcXVvdGUgc3RhcnRzIGEgY29tbWVudCwgd2hpY2ggdGhlIHJvdW5kLXRyaXBcbiAqIGNoZWNrIGNhdGNoZXMgYW5kIHJlamVjdHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVEb3RlbnZWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRvdWJsZVF1b3RlZEJvZHkgPSB2YWx1ZS5yZXBsYWNlQWxsKCdcXG4nLCBTdHJpbmcucmF3YFxcbmApLnJlcGxhY2VBbGwoJ1xccicsIFN0cmluZy5yYXdgXFxyYCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbYCcke3ZhbHVlfSdgLCBgXFxgJHt2YWx1ZX1cXGBgLCBgXCIke2RvdWJsZVF1b3RlZEJvZHl9XCJgXTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChwYXJzZURvdGVudihgJHtrZXl9PSR7Y2FuZGlkYXRlfWApW2tleV0gPT09IHZhbHVlKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlIHZhbHVlIG9mICR7a2V5fSBjYW5ub3QgYmUgbG9zc2xlc3NseSBzZXJpYWxpemVkIGludG8gLmRldi52YXJzOyBzaW1wbGlmeSBpdHMgcXVvdGluZy5gKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlc29sdmVDYXNjYWRlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjb2xsZWN0UGxhaW50ZXh0Rm5veFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL2Zub3hUb21sLmpzJztcblxuLy8gQSBEb2NrZXIgaW1hZ2UgbXVzdCBiYWtlIG9ubHkgdmFsdWVzIHRoYXQgYXJlIHNhZmUgdG8gcGVyc2lzdCBpbiBsYXllcnMgYW5kIHJlZ2lzdHJpZXM6IHRoZVxuLy8gcGxhaW50ZXh0IGB7IGRlZmF1bHQgPSBcIi4uLlwiIH1gIGVudHJpZXMgb2YgZm5veC50b21sLiBBZ2UtZW5jcnlwdGVkIHNlY3JldHMgYXJlIHJlc29sdmVkIGF0XG4vLyBydW50aW1lIGZyb20gdGhlIGRlcGxveW1lbnQgcGxhdGZvcm0ncyBzdG9yZSBpbnN0ZWFkLCBhbmQgdGhlIGFnZSBrZXkgbmV2ZXIgZW50ZXJzIGFuIGltYWdlLlxuLy8gVGhlIHdob2xlIGNvbW1hbmQgdGhlcmVmb3JlIHdvcmtzIGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgdGV4dCBhbG9uZTogdGhlIHByb2plY3QgaXNcbi8vIGxvYWRlZCBXSVRIT1VUIGl0cyBlbnZpcm9ubWVudCAobG9hZGluZyB3b3VsZCBzcGF3biBgZm5veCBleHBvcnRgLCBpLmUuIGRlY3J5cHQgZXZlcnkgc2VjcmV0KVxuLy8gYW5kIHRoZSBwcm9maWxlIGNvbWVzIGZyb20gdGhlIHNoYXJlZCBjYXNjYWRlIHJlc29sdXRpb24sIG5vdCBmcm9tIGxvYWRlZCBzb3VyY2VzLlxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIEdlbkRvY2tlckVudkNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIEdlbkRvY2tlckVudkNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRvY2tlckVudkNvbW1hbmRPcHRpb25zICYgeyBwYXRoPzogc3RyaW5nIH0+O1xuXG5jb25zdCBzdGFuZGFyZFdiRW52TW9kZXMgPSBuZXcgU2V0KFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSk7XG5cbmV4cG9ydCBjb25zdCBnZW5Eb2NrZXJFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRvY2tlckVudkNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2dlbi1kb2NrZXItZW52IFtwYXRoXScsXG4gIGRlc2NyaWJlOlxuICAgICdHZW5lcmF0ZSBhIC5kb2NrZXIuZW52IGZpbGUgdG8gYmFrZSBpbnRvIGEgRG9ja2VyIGltYWdlLCBjb250YWluaW5nIG9ubHkgdGhlIG5vbi1zZWNyZXQgKHBsYWludGV4dCBkZWZhdWx0KSB2YWx1ZXMgb2YgZm5veC50b21sIGZvciB0aGUgc2VsZWN0ZWQgV0JfRU5WLiBTZWNyZXRzIGFyZSBuZXZlciB3cml0dGVuOyBpbmplY3QgdGhlbSBhdCBydW50aW1lIGZyb20gdGhlIGRlcGxveW1lbnQgcGxhdGZvcm0uIFRoZSBmaWxlIGlzIHNoZWxsLXNvdXJjZWFibGUgZG90ZW52IChmb3IgYSBidWlsZC10aW1lIGBzZXQgLWEgJiYgLiAuLy5kb2NrZXIuZW52YCBhbmQgZG90ZW52IHBhcnNlcnMpLCBub3QgZm9yIGBkb2NrZXIgLS1lbnYtZmlsZWAsIHdoaWNoIGtlZXBzIHF1b3RlcyBsaXRlcmFsbHk7IHJ1bnRpbWUgZW50cnlwb2ludHMgbXVzdCBhcHBseSBiYWtlZCB2YWx1ZXMgb25seSB0byBrZXlzIHRoZSBwbGF0Zm9ybSBkaWQgbm90IGFscmVhZHkgc2V0LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT5cbiAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRoJywge1xuICAgICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIC5kb2NrZXIuZW52IGZpbGUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJy5kb2NrZXIuZW52JyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRG9ja2VyRW52Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IEdlbkRvY2tlckVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNoYXJlZCBjYXNjYWRlIHJlc29sdXRpb24ga2VlcHMgdGhpcyBjb21tYW5kJ3MgcHJvZmlsZSBpZGVudGljYWwgdG8gdGhlIG9uZSBldmVyeSBvdGhlclxuICAgIC8vIHdiIGNvbW1hbmQgbG9hZHMuIEFuIHVucmVzb2x2ZWQgY2FzY2FkZSAoLS1hdXRvLWNhc2NhZGUtZW52PWZhbHNlIHdpdGhvdXQgLS1jYXNjYWRlLWVudikgb3JcbiAgICAvLyBhIG5vbi1zdGFuZGFyZCBtb2RlIGlzIGEgaGFyZCBlcnJvcjogaXQgd291bGQgc2lsZW50bHkgYmFrZSB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlc1xuICAgIC8vIGludG8gYSBkZXBsb3kgYXJ0aWZhY3QuXG4gICAgY29uc3QgZW52TmFtZSA9IHJlc29sdmVDYXNjYWRlKGFyZ3YpO1xuICAgIGlmICghZW52TmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCdObyBlbnZpcm9ubWVudCBzZWxlY3RlZDsgcGFzcyAtLWNhc2NhZGUtZW52PTxtb2RlPiAob3IgZHJvcCAtLWF1dG8tY2FzY2FkZS1lbnY9ZmFsc2UpLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZW52TmFtZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgJHtbLi4uc3RhbmRhcmRXYkVudk1vZGVzXS5qb2luKCcsICcpfSwgYnV0IGlzICR7ZW52TmFtZX0uYCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudlZhcnMgPSBjb2xsZWN0UGxhaW50ZXh0Rm5veFZhbHVlcyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGgsIGVudk5hbWUpO1xuICAgIC8vIEEgV0JfRU5WLWZhbWlseSBkZWZhdWx0IHRoYXQgZGlzYWdyZWVzIHdpdGggdGhlIHNlbGVjdGVkIG1vZGUgd291bGQgbGFiZWwgdGhlIGltYWdlIHdpdGggYVxuICAgIC8vIGRpZmZlcmVudCAocG9zc2libHkgbWlzc3BlbGxlZCkgZW52aXJvbm1lbnQgdGhhbiB0aGUgb25lIHdob3NlIHZhbHVlcyBpdCBiYWtlcy5cbiAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBlbnZWYXJzW21hcmtlcl07XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZW52TmFtZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGNoYWxrLnJlZChgZm5veC50b21sIGRlZmluZXMgJHttYXJrZXJ9PSR7dmFsdWV9IGZvciB0aGUgJHtlbnZOYW1lfSBwcm9maWxlOyBhbGlnbiBpdCB3aXRoIHRoZSBtb2RlIG5hbWUuYClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2RlLXBvaW50IG9yZGVyLCBub3QgbG9jYWxlQ29tcGFyZTogdGhlIGZpbGUgbXVzdCBiZSBieXRlLWlkZW50aWNhbCBhY3Jvc3MgYnVpbGQgaG9zdHMgc29cbiAgICAvLyBEb2NrZXIgbGF5ZXIgY2FjaGluZyBhbmQgaW1hZ2UgcmVwcm9kdWNpYmlsaXR5IGFyZSBsb2NhbGUtaW5kZXBlbmRlbnQuXG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gc2VyaWFsaXplRG9ja2VyRW52TGluZShrZXksIHZhbHVlKSk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGFyZ3YucGF0aCA/PyAnLmRvY2tlci5lbnYnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgV291bGQgZ2VuZXJhdGUgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBub24tc2VjcmV0IGVudmlyb25tZW50IHZhcmlhYmxlcyAoJHtlbnZOYW1lfSkuYClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihgR2VuZXJhdGVkICR7b3V0cHV0UGF0aH0gd2l0aCAke2xpbmVzLmxlbmd0aH0gbm9uLXNlY3JldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKCR7ZW52TmFtZX0pLmApXG4gICAgKTtcbiAgfSxcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIG9uZSBgLmRvY2tlci5lbnZgIGFzc2lnbm1lbnQgc28gdGhlIFNBTUUgYnl0ZXMgYXJlIHJlYWQgYmFjayBieSBldmVyeSBjYW5vbmljYWxcbiAqIGNvbnN1bWVyOiBQT1NJWCBzaGVsbCBzb3VyY2luZyAoYHNldCAtYSAmJiAuIC4vLmRvY2tlci5lbnZgIGluIERvY2tlcmZpbGVzIGFuZCBlbnRyeXBvaW50cykgYW5kXG4gKiBkb3RlbnYtZmFtaWx5IHBhcnNlcnMuIFNpbmdsZSBxdW90ZXMgYXJlIHRoZSBvbmx5IHJlcHJlc2VudGF0aW9uIGJvdGggZmFtaWxpZXMgdHJlYXQgYXMgYVxuICogbGl0ZXJhbCBzcGFuIChubyBleHBhbnNpb24sIG5vIGNvbW1hbmQgc3Vic3RpdHV0aW9uKSwgc28gdmFsdWVzIGZub3ggd291bGQgZXhwYW5kIChgJHsuLi59YFxuICogcmVmZXJlbmNlcykgb3IgdGhhdCBubyBzaW5nbGUtcXVvdGVkIHNwYW4gY2FuIGhvbGQgKGFwb3N0cm9waGVzLCBuZXdsaW5lcyksIGFuZCBrZXlzIHRoYXQgYXJlXG4gKiBub3Qgc2hlbGwgaWRlbnRpZmllcnMsIGFyZSByZWplY3RlZCB3aXRoIHRoZSBvZmZlbmRpbmcga2V5IGluc3RlYWQgb2YgYmVpbmcgd3JpdHRlbiBpbiBhIGZvcm1cbiAqIG9uZSBjb25zdW1lciB3b3VsZCBjb3JydXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplRG9ja2VyRW52TGluZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghL15bQS1aYS16X11cXHcqJC8udGVzdChrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2V5ICR7a2V5fSBjYW5ub3QgYmUgd3JpdHRlbiB0byBhIC5kb2NrZXIuZW52IGZpbGU6IGl0IGlzIG5vdCBhIFBPU0lYIHNoZWxsIGlkZW50aWZpZXIuYCk7XG4gIH1cbiAgLy8gYF9fcHJvdG9fX2AgSVMgYSB2YWxpZCBzaGVsbCBpZGVudGlmaWVyLCBidXQgZG90ZW52J3MgcGFyc2VyIGRyb3BzIHRoZSBhc3NpZ25tZW50ICh0aGUgbGVnYWN5XG4gIC8vIHByb3RvdHlwZSBzZXR0ZXIgc3dhbGxvd3MgaXQpLCBzbyB0aGUgY29uc3VtZXJzIHdvdWxkIGRpc2FncmVlIG9uIHRoZSBrZXkncyB2ZXJ5IGV4aXN0ZW5jZS5cbiAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGtleSBfX3Byb3RvX18gY2Fubm90IGJlIHdyaXR0ZW4gdG8gYSAuZG9ja2VyLmVudiBmaWxlOiBkb3RlbnYgcGFyc2VycyBzaWxlbnRseSBkcm9wIGEgX19wcm90b19fIGFzc2lnbm1lbnQuYFxuICAgICk7XG4gIH1cbiAgLy8gQSBiYXJlIGAkTkFNRWAgKHdoaWNoIGZub3ggZXhwb3J0cyBsaXRlcmFsbHkpIGlzIHJlc29sdmVkIGJ5IGRvdGVudi1leHBhbmQtc3R5bGUgY29uc3VtZXJzXG4gIC8vIHdoaWxlIHNoZWxsIHNvdXJjaW5nIGtlZXBzIGl0IGxpdGVyYWwsIGRvdGVudi1leHBhbmQgYWxzbyByZXdyaXRlcyBgXFwkYCB0byBgJGAsIGFuZCBhIHJlc2lkdWFsXG4gIC8vIGAke2AgbWFya3MgYSByZWZlcmVuY2UgZm9ybSB0aGUgY29sbGVjdG9yIGNvdWxkIG5vdCByZXNvbHZlIOKAlCBzbyBhbnkgZXhwYW5zaW9uLXNlbnNpdGl2ZSBgJGBcbiAgLy8gbWFrZXMgdGhlIGNvbnN1bWVycyBkaXNhZ3JlZS4gYCRgIGJlZm9yZSBhIGRpZ2l0LCBzcGFjZSwgYChgLCBvciB0aGUgZW5kIG9mIHRoZSB2YWx1ZSBpcyBpbmVydFxuICAvLyBpbiBib3RoIGZhbWlsaWVzIGFuZCBzdGF5cyByZXByZXNlbnRhYmxlLlxuICBpZiAoL1xcJFtBLVphLXpfJHtdfFxcXFxcXCQvLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSB2YWx1ZSBvZiAke2tleX0gY29udGFpbnMgYW4gZXhwYW5zaW9uLXNlbnNpdGl2ZSAkIHJlZmVyZW5jZTsgd2IgZ2VuLWRvY2tlci1lbnYgZG9lcyBub3QgZXhwYW5kIHJlZmVyZW5jZXMg4oCUIGlubGluZSB0aGUgdmFsdWUgaW4gZm5veC50b21sLmBcbiAgICApO1xuICB9XG4gIC8vIEEgdHJhaWxpbmcgYmFja3NsYXNoIG1ha2VzIGRvdGVudidzIHBhcnNlciByZWFkIHRoZSBjbG9zaW5nIHF1b3RlIGFzIGFuIGVzY2FwZWQgcXVvdGUgYW5kXG4gIC8vIHN3YWxsb3cgdGhlIGZvbGxvd2luZyBsaW5lcywgd2hpbGUgc2hlbGwgc291cmNpbmcgcmVhZHMgdGhlIHZhbHVlIGNvcnJlY3RseS5cbiAgaWYgKC9bJ1xcblxccl0vLnRlc3QodmFsdWUpIHx8IHZhbHVlLmVuZHNXaXRoKCdcXFxcJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHZhbHVlIG9mICR7a2V5fSBjYW5ub3QgYmUgd3JpdHRlbiB0byBhIC5kb2NrZXIuZW52IGZpbGU6IGFwb3N0cm9waGVzLCBuZXdsaW5lcywgYW5kIGEgdHJhaWxpbmcgYmFja3NsYXNoIGFyZSBub3QgcmVwcmVzZW50YWJsZSBpbiBpdHMgc2luZ2xlLXF1b3RlZCwgc2hlbGwtc291cmNlYWJsZSBmb3JtYXQuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGAke2tleX09JyR7dmFsdWV9J2A7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBwcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZSwgb3V0cHV0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQpO1xuICBpZiAobm9ybWFsaXplZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXhpdENvZGUgIT09IDAgfHwgaGFzV2FybmluZ091dHB1dChvdXRwdXQpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBCdWZmZXJlZFJ1blJlc3VsdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVNjcmlwdCwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByaW50QnVmZmVyZWRPdXRwdXQsIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQgfSBmcm9tICcuLi91dGlscy9vdXRwdXQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyByZXBvcnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIExpbnRDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgTGludENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPExpbnRDb21tYW5kT3B0aW9ucz4gJiB7XG4gICctLSc/OiB1bmtub3duW107XG4gIF86IHVua25vd25bXTtcbiAgcHJpbnRBbGxPdXRwdXQ/OiBib29sZWFuO1xufTtcblxuY29uc3Qgb3hsaW50RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10pO1xuY29uc3QgcHl0aG9uRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydweSddKTtcbmNvbnN0IGRhcnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2RhcnQnXSk7XG5jb25zdCBydXN0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydycyddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuaW50ZXJmYWNlIExpbnRSdW5Db21tYW5kIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xufVxuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICAvLyBUaGUgdGVzdCBsYXlvdXQgaXMgYSBzdGF0aWMgc3RydWN0dXJhbCBydWxlLCBzbyBgd2IgbGludGAgaXMgaXRzIGhvbWU6IGB3YiB2ZXJpZnlgICh2aWEgaXRzXG4gIC8vIGNsZWFudXAgc3RlcCkgYW5kIENJJ3MgbGludCBqb2IgdGhlbiBlbmZvcmNlIGl0IHdpdGggbm8gZXh0cmEgd2lyaW5nLCBhbmQgYSBzdHJheSB0ZXN0IGZpbGVcbiAgLy8gc3VyZmFjZXMgaGVyZSBpbnN0ZWFkIG9mIGF0IGB3YiB0ZXN0YCwgd2hlcmUgYC0tcGFzc1dpdGhOb1Rlc3RzYCB3b3VsZCBvdGhlcndpc2UgbGV0IHRoZSBzdWl0ZVxuICAvLyBwYXNzIHdoaWxlIHNpbGVudGx5IHJ1bm5pbmcgbm9uZSBvZiBpdC4gUmVwb3J0ZWQgYmVmb3JlIHRoZSBsaW50ZXJzIHJ1biBzbyB0aGUgZGlhZ25vc2lzIGxlYWRzXG4gIC8vIHRoZSBvdXRwdXQsIGJ1dCBuZXZlciBzaG9ydC1jaXJjdWl0cyB0aGVtOiBgLS1maXggLS1mb3JtYXRgIG11c3Qgc3RpbGwgY2xlYW4gdXAgd2hhdCBpdCBjYW4sXG4gIC8vIGJlY2F1c2UgYSBsYXlvdXQgdmlvbGF0aW9uIGlzIG5vdCBhdXRvLWZpeGFibGUgYW5kIHdvdWxkIG90aGVyd2lzZSBibG9jayBldmVyeSBvdGhlciBmaXguXG4gIC8vIFRocmVlIHJ1biBzaGFwZXMgb3B0IG91dC4gRXhwbGljaXQtcGF0aCBydW5zIChlLmcuIHRoZSBsZWZ0aG9vayBwcmUtY29tbWl0IGhvb2spIHNraXAgaXQgc28gYVxuICAvLyBwcmUtZXhpc3RpbmcgdmlvbGF0aW9uIGluIGFuIHVudG91Y2hlZCBwYWNrYWdlIGNhbm5vdCBibG9jayBhbiB1bnJlbGF0ZWQgY29tbWl0LiBgLS1kcnktcnVuYFxuICAvLyBza2lwcyBpdCBzbyB0aGlzIHN0YXlzIHRoZSBvbmUgc3RlcCB0aGF0IGNvdWxkIGZhaWwgYSBydW4gd2hvc2Ugd2hvbGUgY29udHJhY3QgaXMgdG8gZXhlY3V0ZVxuICAvLyBub3RoaW5nLiBGb3JtYXR0ZXItb25seSBydW5zIChgLS1mb3JtYXRgIHdpdGhvdXQgYC0tZml4YCkgc2tpcCBpdCBiZWNhdXNlIHRoZXkgbGludCBub3RoaW5nIGF0XG4gIC8vIGFsbCwgYW5kIHdiZnkgY2hhaW5zIHRoYXQgc2NyaXB0IGFzIGBidW4gd2IgbGludCAtLWZvcm1hdCAmJiBidW4gcnVuIGZvcm1hdC1jb2RlYCBmb3IgRGFydCBhbmRcbiAgLy8gUHl0aG9uIHJlcG9zaXRvcmllcyDigJQgZmFpbGluZyBpdCB0aGVyZSB3b3VsZCBzaWxlbnRseSBzdHJpcCB0aGVpciBvbmx5IGZvcm1hdHRpbmcgcGFzcy5cbiAgY29uc3QgdmlvbGF0ZXNUZXN0U3RydWN0dXJlID1cbiAgICBzaG91bGRSdW5MaW50ZXJzICYmICFhcmd2LmRyeVJ1biAmJiBmaWxlcy5sZW5ndGggPT09IDAgJiYgcmVwb3J0VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdHMuZGVzY2VuZGFudHMpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgLy8gYGNhcmdvIGZtdCAtLWFsbGAgYWx3YXlzIGZvcm1hdHMgdGhlIHdob2xlIHdvcmtzcGFjZSwgc28gd2UgdHJhY2sgdGFyZ2V0XG4gIC8vIHByb2plY3RzIHJhdGhlciB0aGFuIGluZGl2aWR1YWwgZmlsZSBwYXRocy4gRXZlcnkgcHJvamVjdCB3aXRoIGl0cyBvd25cbiAgLy8gYENhcmdvLnRvbWxgIHJ1bnMgaXRzIG93biBgY2FyZ28gZm10IC0tYWxsYDsgd2UgaW50ZW50aW9uYWxseSBkbyBub3QgZGVkdXBcbiAgLy8gYnkgZGlyZWN0b3J5LiBBIG5lc3RlZCBvciBzaWJsaW5nIGNyYXRlIGNhbiBiZSBhbiBpbmRlcGVuZGVudCBDYXJnb1xuICAvLyB3b3Jrc3BhY2UgdGhhdCBhIHBhcmVudCdzIGBjYXJnbyBmbXQgLS1hbGxgIG5ldmVyIHJlYWNoZXMsIHNvIHNraXBwaW5nIGl0XG4gIC8vIHdvdWxkIGxlYXZlIGl0IHVuZm9ybWF0dGVkLCB3aGlsZSBhbnkgZ2VudWluZWx5IG92ZXJsYXBwaW5nIHJ1bnMgYXJlXG4gIC8vIGhhcm1sZXNzIGJlY2F1c2UgcnVzdGZtdCBpcyBkZXRlcm1pbmlzdGljIGFuZCBpZGVtcG90ZW50LiBEZWR1cGluZyBieSByZWFsXG4gIC8vIHdvcmtzcGFjZSBtZW1iZXJzaGlwIHdvdWxkIHJlcXVpcmUgaW52b2tpbmcgYGNhcmdvIGxvY2F0ZS1wcm9qZWN0YC5cbiAgY29uc3QgY2FyZ29Gb3JtYXRQcm9qZWN0cyA9IG5ldyBTZXQ8UHJvamVjdD4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBydXN0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjYXJnb0Zvcm1hdFByb2plY3RzLmFkZChwcm9qZWN0KTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgcHJlc2VydmVDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzXSBvZiBweXRob25GaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YsIHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIGNhcmdvRm9ybWF0UHJvamVjdHMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNPd25Tb3VyY2VDb2RlKSB7XG4gICAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGlmIChsaW50Q29tbWFuZCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0NhcmdvVG9tbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpbnRFeGl0Q29kZXM6IG51bWJlcltdID0gW107XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBjb25zdCBmb3JtYXR0ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGZvcm1hdHRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhmb3JtYXR0ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4uZm9ybWF0dGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcykge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDAgJiYgcHJvamVjdHMuc2VsZi5oYXNQcmV0dGllcikge1xuICAgICAgY29uc3QgcHJldHRpZXJSZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICctLWNhY2hlJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSB8fCB2aW9sYXRlc1Rlc3RTdHJ1Y3R1cmUgPyAxIDogMDtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmRzKFxuICBjb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0W10+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzLm1hcCgoeyBjb21tYW5kLCBwcm9qZWN0IH0pID0+IHJ1bkxpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdD4ge1xuICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIHByb2plY3QpO1xuICAgIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykudGhlbigocmVzdWx0KSA9PiAoe1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgY29tbWFuZDogbm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsXG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykudGhlbigoZXhpdENvZGUpID0+ICh7IGV4aXRDb2RlIH0pKTtcbn1cblxuZnVuY3Rpb24gcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhcbiAgcmVzdWx0czogTGludFJ1blJlc3VsdFtdLFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJ3ByaW50QWxsT3V0cHV0JyB8ICdzaWxlbnQnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHByaW50YWJsZVJlc3VsdHMgPVxuICAgIGFyZ3Yuc2lsZW50ICYmICFhcmd2LnByaW50QWxsT3V0cHV0XG4gICAgICA/IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+ICdvdXRwdXQnIGluIHJlc3VsdCAmJiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCkpXG4gICAgICA6IHJlc3VsdHM7XG4gIGlmIChwcmludGFibGVSZXN1bHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHByaW50YWJsZVJlc3VsdHMpIHtcbiAgICBpZiAoISgnb3V0cHV0JyBpbiByZXN1bHQpKSBjb250aW51ZTtcblxuICAgIGlmIChhcmd2LnByaW50QWxsT3V0cHV0KSB7XG4gICAgICBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG4gICAgICB9XG4gICAgICBwcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQ6IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCk6IHZvaWQge1xuICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuXG4gIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDAgJiYgc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KHJlc3VsdC5jb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0LnRyaW0oKTtcbiAgaWYgKG91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZEhlYWRlcihjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQoY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCcgb3hmbXQgJykgfHwgY29tbWFuZC5pbmNsdWRlcygnIHNvcnQtcGFja2FnZS1qc29uICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMaW50Q29tbWFuZChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNUeXBlQXdhcmVPeGxpbnQnPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLy8gVHlwZS1hd2FyZSBtb2RlIG1ha2VzIG94bGludCByZXBvcnQgdHlwZS1jaGVjayBkaWFnbm9zdGljcy4gUGFzcyB0aGUgZmxhZ3MgZXhwbGljaXRseVxuICAgICAgLy8gYmVjYXVzZSBveGxpbnQgcmVqZWN0cyB0aGUgZXF1aXZhbGVudCBvcHRpb25zIGluIG5vbi1yb290IGNvbmZpZ3MsIHNvIHBlci1wYWNrYWdlIHJ1bnNcbiAgICAgIC8vIGluIG1vbm9yZXBvcyB3b3VsZCBvdGhlcndpc2UgbWlzcyB0eXBlIGVycm9ycy5cbiAgICAgIC4uLihwcm9qZWN0Lmhhc1R5cGVBd2FyZU94bGludCA/IFsnLS10eXBlLWF3YXJlJywgJy0tdHlwZS1jaGVjayddIDogW10pLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSB0b0xpbnRUYXJnZXRzKGZpbGVzKTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRvTGludFRhcmdldHMoZmlsZXMpXSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCk6IHN0cmluZyB7XG4gIC8vIEZvcm1hdHRpbmcgbXVzdCBnbyB0aHJvdWdoIGNhcmdvIChub3QgcnVzdGZtdCBvbiBpbmRpdmlkdWFsIGZpbGVzKSBzbyBlYWNoXG4gIC8vIGNyYXRlJ3MgZWRpdGlvbiBhbmQgcnVzdGZtdCBjb25maWd1cmF0aW9uIGFyZSByZXNwZWN0ZWQ7IGAtLWFsbGAgY292ZXJzXG4gIC8vIGV2ZXJ5IHdvcmtzcGFjZSBtZW1iZXIgYW5kIGlzIGEgbm8tb3Agc3VmZml4IGZvciBzaW5nbGUtY3JhdGUgcHJvamVjdHMuXG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2NhcmdvJywgJ2ZtdCcsICctLWFsbCddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udG9MaW50VGFyZ2V0cyhmaWxlcyldKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2FuYWx5emUnLCAuLi50b0xpbnRUYXJnZXRzKGZpbGVzKV0pO1xufVxuXG5mdW5jdGlvbiB0b0xpbnRUYXJnZXRzKGZpbGVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwcmV0dGllck9ubHlFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZmlsZVBhdGgsIGAqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jztcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2hlY2sgYm90aCBzdGFja3MgdG8gY2F0Y2ggcHJvY2Vzc2VzIGJvdW5kIG9ubHkgb24gSVB2NiBvciBJUHY0LlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgWycxMjcuMC4wLjEnLCAnOjonXSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHByb2JlUG9ydChob3N0LCBwb3J0KTtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZVBvcnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUZOT1NVUFBPUlQnKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jLCBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcbmNvbnN0IHN0YWxlUHJvY2Vzc1BvbGxJbnRlcnZhbE1zID0gMTAwO1xuY29uc3Qgc3RhbGVQcm9jZXNzTWF4UG9sbHMgPSAxMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICBraWxsTGlzdGVuaW5nUHJvY2Vzc2VzQnlQb3J0KHBvcnQpO1xufVxuXG5mdW5jdGlvbiBraWxsTGlzdGVuaW5nUHJvY2Vzc2VzQnlQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHBpZCBvZiBsaXN0TGlzdGVuaW5nUHJvY2Vzc0lkcyhwb3J0KSkge1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0TGlzdGVuaW5nUHJvY2Vzc0lkcyhwb3J0OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKCdsc29mJywgWyctdGknLCBgdGNwOiR7cG9ydH1gLCAnLXNUQ1A6TElTVEVOJ10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0ZG91dFxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHBpZCkgPT4gTnVtYmVyKHBpZC50cmltKCkpKVxuICAgICAgLmZpbHRlcigocGlkKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCAmJiBwaWQgIT09IHByb2Nlc3MucGlkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVTdGFsZVByb2Nlc3MocGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFsZVByb2Nlc3NNYXhQb2xsczsgaSsrKSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VTUkNIJykgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MsIHJlbW92ZVN0YWxlUHJvY2VzcyB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnZGVsYXktbXMnOiB7XG4gICAgZGVmYXVsdDogNTAwMCxcbiAgICBkZXNjcmliZTogJ0RlbGF5IGJlZm9yZSBzdGFydGluZyB0aGUgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG50eXBlIE1haW50ZW5hbmNlQXJndiA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+ICYge1xuICBhY3Rpb246ICdzdGFydCcgfCAnc3RvcCc7XG59O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0cyA9IDU7XG5jb25zdCBtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyA9IDEwMDtcbmNvbnN0IG1heFRpbWVvdXREZWxheU1zID0gMl8xNDdfNDgzXzY0NztcbmNvbnN0IG1haW50ZW5hbmNlUGlkRGlyZWN0b3J5TmFtZSA9ICcud2InO1xuY29uc3QgbWFpbnRlbmFuY2VIdG1sID0gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImphXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPlxuICAgIDx0aXRsZT7jg6Hjg7Pjg4bjg4rjg7PjgrnkuK08L3RpdGxlPlxuICAgIDxzdHlsZT5cbiAgICAgIGJvZHkge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgICAgIH1cblxuICAgICAgbWFpbiB7XG4gICAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgaDEge1xuICAgICAgICBmb250LXNpemU6IDI4cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxtYWluPlxuICAgICAgPGgxPuePvuWcqOODoeODs+ODhuODiuODs+OCueS4reOBp+OBmTwvaDE+XG4gICAgICA8cD7nmobmp5jjgavjga/jgZTkuI3kvr/jgpLjgYrjgYvjgZHjgZfjgb7jgZnjgYzjgIHjg6Hjg7Pjg4bjg4rjg7PjgrnntYLkuobjgb7jgafjgZfjgbDjgonjgY/jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgII8L3A+XG4gICAgPC9tYWluPlxuICA8L2JvZHk+XG48L2h0bWw+YDtcblxuZXhwb3J0IGNvbnN0IG1haW50ZW5hbmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBNYWludGVuYW5jZUFyZ3Y+ID0ge1xuICBjb21tYW5kOiAnbWFpbnRlbmFuY2UgPGFjdGlvbj4nLFxuICBkZXNjcmliZTogJ1N0YXJ0IG9yIHN0b3AgYSBsaWdodHdlaWdodCBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4gRXhhbXBsZTogd2IgbWFpbnRlbmFuY2Ugc3RhcnQnLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wb3NpdGlvbmFsKCdhY3Rpb24nLCB7XG4gICAgICAgIGNob2ljZXM6IFsnc3RhcnQnLCAnc3RvcCddIGFzIGNvbnN0LFxuICAgICAgICBkZXNjcmliZTogJ01haW50ZW5hbmNlIHNlcnZlciBhY3Rpb24nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKSBhcyB1bmtub3duIGFzIEFyZ3Y8TWFpbnRlbmFuY2VBcmd2PixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBhcmd2LmFjdGlvbjtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSAke2FjdGlvbn0gYmVjYXVzZSBXQl9FTlYgaXMgdGVzdC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KHByb2plY3QuZW52LlBPUlQpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIGF3YWl0IHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCwgYXJndi5kZWxheU1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0b3AnKSB7XG4gICAgICBhd2FpdCBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1haW50ZW5hbmNlIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBwYXJzZVBvcnQocG9ydEVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgYXNzZXJ0Lm9rKE51bWJlci5pc0ludGVnZXIocG9ydCkgJiYgcG9ydCA+IDAsIGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyLCBkZWxheU1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXNzZXJ0Lm9rKFxuICAgIE51bWJlci5pc0Zpbml0ZShkZWxheU1zKSAmJiBkZWxheU1zID49IDAgJiYgZGVsYXlNcyA8PSBtYXhUaW1lb3V0RGVsYXlNcyxcbiAgICBgZGVsYXktbXMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICR7bWF4VGltZW91dERlbGF5TXN9OiAke2RlbGF5TXN9YFxuICApO1xuXG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gYXdhaXQgd3JpdGVNYWludGVuYW5jZVBpZEZpbGUocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgY2xlYW51cCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgsIHByb2Nlc3MucGlkKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9O1xuICBjb25zdCByZW1vdmVTaWduYWxIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLm9mZignU0lHSU5UJywgaGFuZGxlU2lnbmFsKTtcbiAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1FVSVQnLCBoYW5kbGVTaWduYWwpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgaGFuZGxlU2lnbmFsKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgaGFuZGxlU2lnbmFsKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoZGVsYXlNcywgdW5kZWZpbmVkLCB7IHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGNvbnN0IHNlcnZlciA9IGF3YWl0IGNyZWF0ZUFuZExpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHBvcnQpO1xuICAgIGlmICghc2VydmVyKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oYFN0YXJ0ZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbiAgICBhd2FpdCB3YWl0Rm9yU2h1dGRvd24oc2VydmVyKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcblxuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG4gICAgYXdhaXQgY2xlYW51cCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFuZExpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHBvcnQ6IG51bWJlcik6IFByb21pc2U8aHR0cC5TZXJ2ZXIgfCB1bmRlZmluZWQ+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyLCBwb3J0LCBoYW5kbGVSdW50aW1lTWFpbnRlbmFuY2VTZXJ2ZXJFcnJvcik7XG4gICAgICByZXR1cm4gc2VydmVyO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcik7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJyAmJiBhdHRlbXB0IDwgbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0cykge1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KG1haW50ZW5hbmNlTGlzdGVuUmV0cnlEZWxheU1zKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2Ugc2VydmVyIGJlY2F1c2UgcG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydCwgZXJyKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVhY2hhYmxlIG1haW50ZW5hbmNlIHNlcnZlciBzdGFydHVwIHN0YXRlLicpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNYWludGVuYW5jZVN0YXJ0dXBFcnJvcihwb3J0OiBudW1iZXIsIGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pOiBuZXZlciB7XG4gIGlmIChlcnJvci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBNYWludGVuYW5jZSBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3QsIHBvcnQpO1xuICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RvcHBlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYWludGVuYW5jZVNlcnZlcigpOiBodHRwLlNlcnZlciB7XG4gIHJldHVybiBodHRwLmNyZWF0ZVNlcnZlcigoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMywge1xuICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tc3RvcmUnLFxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLFxuICAgIH0pO1xuICAgIHJlc3BvbnNlLmVuZChtYWludGVuYW5jZUh0bWwpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIoXG4gIHNlcnZlcjogaHR0cC5TZXJ2ZXIsXG4gIHBvcnQ6IG51bWJlcixcbiAgb25SdW50aW1lRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25TdGFydHVwRXJyb3IgPSAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICBzZXJ2ZXIub2ZmKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH07XG4gICAgY29uc3Qgb25MaXN0ZW5pbmcgPSAoKTogdm9pZCA9PiB7XG4gICAgICBzZXJ2ZXIub2ZmKCdlcnJvcicsIG9uU3RhcnR1cEVycm9yKTtcbiAgICAgIHNlcnZlci5vbignZXJyb3InLCBvblJ1bnRpbWVFcnJvcik7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsIG9uTGlzdGVuaW5nKTtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcwLjAuMC4wJyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yU2h1dGRvd24oc2VydmVyOiBodHRwLlNlcnZlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNodXRkb3duID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gY2xvc2UgbWFpbnRlbmFuY2Ugc2VydmVyOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH07XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIHNodXRkb3duKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyOiBodHRwLlNlcnZlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2VydmVyLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRVJSX1NFUlZFUl9OT1RfUlVOTklORycpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICBzZXJ2ZXIuY2xvc2VBbGxDb25uZWN0aW9ucygpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVNYWludGVuYW5jZVBpZEZpbGUocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGlkRmlsZVBhdGggPSBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3QsIHBvcnQpO1xuICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUocGlkRmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHBpZEZpbGVQYXRoLCBgJHtwcm9jZXNzLnBpZH1cXG5gLCAndXRmOCcpO1xuICByZXR1cm4gcGlkRmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxNYWludGVuYW5jZVByb2Nlc3MocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gIGlmIChwaWQgIT09IHVuZGVmaW5lZCAmJiBwaWQgIT09IHByb2Nlc3MucGlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgYXdhaXQgcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZCk7XG4gIH1cbiAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwaWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGg6IHN0cmluZywgZXhwZWN0ZWRQaWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4cGVjdGVkUGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwaWQgPSBhd2FpdCByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoKTtcbiAgICBpZiAocGlkICE9PSBleHBlY3RlZFBpZCkgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGZzLnJtKHBpZEZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBpZFRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShwaWRGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBwaWQgPSBOdW1iZXIocGlkVGV4dC50cmltKCkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCA/IHBpZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBnZXRNYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3Qucm9vdERpclBhdGgsIHBvcnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUsIGBtYWludGVuYW5jZS0ke3BvcnR9LnBpZGApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuLyoqXG4gKiBNYXRlcmlhbGl6YXRpb24gb2YgYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHJlZ2lzdHJ5IChWZXJkYWNjaW8pIGRlcGVuZGVuY2llcyBmb3IgRG9ja2VyIGJ1aWxkczpcbiAqIHRoZSBwYWNrYWdlcyBhcmUgZG93bmxvYWRlZCBvbiB0aGUgaG9zdCAocmVnaXN0cnkgbWFwcGluZyB2aWEgdGhlIHByb2plY3QgLm5wbXJjLCBhdXRoIHZpYVxuICogfi8ubnBtcmMgbG9jYWxseSBvciBWRVJEQUNDSU9fVE9LRU4gb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHNcbiAqIG5lZWQgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXIoPzotcHJpdmF0ZSk/XFwvLywgJycpO1xufVxuXG4vLyBgZ2l0OmAvYGdpdCtgL2BnaXRAYCAobm90IHRoZSBiYXJlIHdvcmQgYGdpdGApOiBucG0gYWxsb3dzIGFyYml0cmFyeSBkaXN0LXRhZ3MsIHNvIGEgdGFnIG5hbWVkXG4vLyBgZ2l0YCBvciBgZ2l0LW5leHRgIG11c3Qgc3RpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ2lzdHJ5IHNwZWNpZmllci5cbmNvbnN0IG5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMgPSBbXG4gICdnaXQ6JyxcbiAgJ2dpdCsnLFxuICAnZ2l0QCcsXG4gICdmaWxlOicsXG4gICdsaW5rOicsXG4gICd3b3Jrc3BhY2U6JyxcbiAgJ2h0dHA6JyxcbiAgJ2h0dHBzOicsXG4gICdwb3J0YWw6JyxcbiAgJ3BhdGNoOicsXG5dO1xuXG4vLyBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igd2hpY2ggZ2l0IHNwZWNpZmllcnMgdGhlIHByaXZhdGUtcGFja2FnZSB0b29saW5nIHN1cHBvcnRzOlxuLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcyBleGFjdGx5IHRoZXNlLCBhbmQgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgIG11c3Rcbi8vIHJld3JpdGUgZXhhY3RseSB0aGVzZSAocmV3cml0aW5nIG90aGVyIG9yZ3MnIFNTSCBVUkxzIHdvdWxkIHBvaW50IGF0IG5ldmVyLW1hdGVyaWFsaXplZCBwYXRocykuXG5jb25zdCBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4gPSAvXmdpdEBnaXRodWJcXC5jb206KD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpXFwvW14vI10rKD86XFwuZ2l0KT8oPzojLiopPyQvO1xuXG4vLyBSZXR1cm5zIGJvb2xlYW4gKG5vdCBhIGB2YWx1ZSBpcyBzdHJpbmdgIHByZWRpY2F0ZSk6IGEgcHJlZGljYXRlIHdvdWxkIG5hcnJvdyB0aGUgbmVnYXRpdmVcbi8vIGJyYW5jaCB0byBgdW5kZWZpbmVkYCBhbmQgYnJlYWsgYGVsc2UgaWZgIGNoYWlucyBvdmVyIGBzdHJpbmcgfCB1bmRlZmluZWRgIGRlcGVuZGVuY3kgdmFsdWVzLlxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIG5hbWUuc3RhcnRzV2l0aChgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS9gKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAhbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUmVnaXN0cnlBdXRoIHtcbiAgcmVnaXN0cnlVcmw6IHN0cmluZztcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWVyZ2Ugfi8ubnBtcmMgYW5kIHRoZSBwcm9qZWN0IC5ucG1yYyAocHJvamVjdCBzZXR0aW5ncyB0YWtlIHByZWNlZGVuY2UpIHRvIHJlc29sdmUgdGhlIHByaXZhdGVcbiAqIHNjb3BlJ3MgcmVnaXN0cnkgVVJMIGFuZCB0b2tlbi4gVkVSREFDQ0lPX1RPS0VOIHNlcnZlcyBhcyB0aGUgZmFsbGJhY2sgdG9rZW4gb24gQ0kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aDogc3RyaW5nKTogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgbnBtcmNQYXRocyA9IFtwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm5wbXJjJyksIHBhdGguam9pbihyb290RGlyUGF0aCwgJy5ucG1yYycpXTtcbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgbnBtcmNQYXRocykge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudHJpZXMsIHBhcnNlTnBtcmMoZnMucmVhZEZpbGVTeW5jKG5wbXJjUGF0aCwgJ3V0ZjgnKSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBucG1yYyBmaWxlcyBhcmUgZmluZTsgdGhlIG90aGVyIGZpbGUgb3IgVkVSREFDQ0lPX1RPS0VOIG1heSBzdGlsbCBwcm92aWRlIGF1dGguXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlVcmwgPSBlbnRyaWVzW2Ake1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5YF0/LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICBpZiAoIXJlZ2lzdHJ5VXJsKSByZXR1cm47XG5cbiAgLy8gbnBtLXN0eWxlIFVSSSBtYXRjaGluZzogbm9ybWFsaXplIGJvdGggc2lkZXMgdG8gYSB0cmFpbGluZyBzbGFzaCBzbyBhIHRva2VuIGZvclxuICAvLyBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20vYCBjYW4gbmV2ZXIgbWF0Y2ggYC8vdmVyZGFjY2lvLmV4YW1wbGUuY29tLW90aGVyLm9yZy9gLCBhbmQgcGljayB0aGVcbiAgLy8gTU9TVCBTUEVDSUZJQyAobG9uZ2VzdCkgbWF0Y2hpbmcgcHJlZml4IHNvIGAvL2hvc3QvcHJpdmF0ZS9gIGJlYXRzIGAvL2hvc3QvYC5cbiAgY29uc3Qgbm9ybWFsaXplZFJlZ2lzdHJ5VXJsID0gYCR7cmVnaXN0cnlVcmwucmVwbGFjZSgvXmh0dHBzPzovLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyl9L2A7XG4gIGxldCBtYXRjaGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG1hdGNoZWRQcmVmaXhMZW5ndGggPSAtMTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAvLyBTa2lwIGVtcHR5IHRva2VucyAoYW4gdW5zZXQgYCR7VkFSfWAgZXhwYW5kcyB0byAnJyk6IGFuIGVtcHR5IG1hdGNoIG11c3Qgbm90IGRlZmVhdCB0aGVcbiAgICAvLyBWRVJEQUNDSU9fVE9LRU4gZmFsbGJhY2sgYmVsb3cuXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoJzpfYXV0aFRva2VuJykgfHwgIXZhbHVlKSBjb250aW51ZTtcbiAgICBjb25zdCBwcmVmaXggPSBgJHtrZXkuc2xpY2UoMCwgLSc6X2F1dGhUb2tlbicubGVuZ3RoKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgICBpZiAobm9ybWFsaXplZFJlZ2lzdHJ5VXJsLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBwcmVmaXgubGVuZ3RoID4gbWF0Y2hlZFByZWZpeExlbmd0aCkge1xuICAgICAgbWF0Y2hlZFByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7XG4gICAgICBtYXRjaGVkVG9rZW4gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gTm8gUHJvamVjdCBpbnN0YW5jZSBleGlzdHMgYXQgdGhpcyBsYXllciwgc28gcHJvY2Vzcy5lbnYgaXMgdGhlIG9ubHkgc291cmNlIGZvciB0aGVcbiAgLy8gQ0ktaW5qZWN0ZWQgZmFsbGJhY2sgdG9rZW4uXG4gIGNvbnN0IGF1dGhUb2tlbiA9IG1hdGNoZWRUb2tlbiA/PyBwcm9jZXNzLmVudi5WRVJEQUNDSU9fVE9LRU47XG4gIHJldHVybiB7IHJlZ2lzdHJ5VXJsLCBhdXRoVG9rZW4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTnBtcmMoY29udGVudDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLnN0YXJ0c1dpdGgoJyMnKSB8fCBsaW5lLnN0YXJ0c1dpdGgoJzsnKSkgY29udGludWU7XG5cbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA8PSAwKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IGxpbmVcbiAgICAgIC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpXG4gICAgICAudHJpbSgpXG4gICAgICAucmVwbGFjZUFsbCgvXFwkXFx7KFtefV0rKVxcfS9nLCAoXywgdmFyaWFibGVOYW1lOiBzdHJpbmcpID0+IHByb2Nlc3MuZW52W3ZhcmlhYmxlTmFtZV0gPz8gJycpO1xuICAgIGVudHJpZXNba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIERvd25sb2FkIGFuZCBleHRyYWN0IG9uZSByZWdpc3RyeSBwYWNrYWdlIGludG8gYHRhcmdldERpclBhdGhgLiBUaGUgc3BlY2lmaWVyIG1heSBiZSBhbiBleGFjdFxuICogc2VtdmVyIHZlcnNpb24gKHRoZSBvcmcncyBjb21tb24gY2FzZSB2aWEgYnVuZmlnIGBleGFjdCA9IHRydWVgKSwgYW55IHNlbXZlciByYW5nZSAocmVzb2x2ZWRcbiAqIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5J3MgcHVibGlzaGVkIHZlcnNpb25zLCBtYXRjaGluZyBgbnBtIGluc3RhbGxgKSwgb3IgYVxuICogZGlzdC10YWcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyxcbiAgdGFyZ2V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHJlc29sdmVWZXJzaW9uKGF1dGgsIHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3BlY2lmaWVyKTtcbiAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBmZXRjaFJlZ2lzdHJ5SnNvbjx7IGRpc3Q/OiB7IHRhcmJhbGw/OiBzdHJpbmcgfSB9PihcbiAgICBhdXRoLFxuICAgIGAke2F1dGgucmVnaXN0cnlVcmx9LyR7ZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpfS8ke3ZlcnNpb259YFxuICApO1xuICBjb25zdCB0YXJiYWxsVXJsID0gbWV0YWRhdGEuZGlzdD8udGFyYmFsbDtcbiAgaWYgKCF0YXJiYWxsVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJiYWxsIFVSTCBmb3IgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufSBpbiAke2F1dGgucmVnaXN0cnlVcmx9LmApO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB0YXJiYWxsVXJsKTtcbiAgY29uc3QgdGFyYmFsbFBhdGggPSBwYXRoLmpvaW4oXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3Yi1wcml2YXRlLXBhY2thZ2UtJykpLFxuICAgICdwYWNrYWdlLnRneidcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUodGFyYmFsbFBhdGgsIEJ1ZmZlci5mcm9tKGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGFyZ2V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gbnBtIHRhcmJhbGxzIHBsYWNlIHRoZSBjb250ZW50IHVuZGVyIGEgdG9wLWxldmVsIGBwYWNrYWdlL2AgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCd0YXInLCBbJy14emYnLCB0YXJiYWxsUGF0aCwgJy1DJywgdGFyZ2V0RGlyUGF0aCwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10sIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufSAoJHt0YXJiYWxsVXJsfSkuYCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguZGlybmFtZSh0YXJiYWxsUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVmVyc2lvbihcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBQcmVyZWxlYXNlIGFuZCBgK2J1aWxkYCBtZXRhZGF0YSBhcmUgYm90aCBwYXJ0IG9mIHZhbGlkIGV4YWN0IFNlbVZlciB2ZXJzaW9ucywgc28gYW4gZXhhY3RcbiAgLy8gc3BlY2lmaWVyIHJlc29sdmVzIHRvIGl0c2VsZiB3aXRob3V0IGEgcGFja3VtZW50IGZldGNoLlxuICBpZiAoaXNFeGFjdFZlcnNpb24odmVyc2lvblNwZWNpZmllcikpIHJldHVybiB2ZXJzaW9uU3BlY2lmaWVyO1xuXG4gIGNvbnN0IHBhY2t1bWVudCA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPFBhY2t1bWVudD4oYXV0aCwgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9YCk7XG4gIGNvbnN0IHZlcnNpb24gPSBzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCh2ZXJzaW9uU3BlY2lmaWVyLCBwYWNrdW1lbnQpO1xuICBpZiAoIXZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc29sdmUgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9uU3BlY2lmaWVyfSBhZ2FpbnN0ICR7YXV0aC5yZWdpc3RyeVVybH07IHVzZSBhbiBleGFjdCB2ZXJzaW9uLCBhIHNlbXZlciByYW5nZSwgb3IgYSBkaXN0LXRhZy5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuaW50ZXJmYWNlIFBhY2t1bWVudCB7XG4gICdkaXN0LXRhZ3MnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgdmVyc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBucG0ncyBzcGVjaWZpZXIgY2xhc3NpZmljYXRpb246IGAqYCBhbmQgZGlzdC10YWcgbmFtZXMgcmVzb2x2ZSB2aWEgZGlzdC10YWdzIChucG0gcmVzb2x2ZXMgYCpgXG4gKiB0byB0aGUgYGxhdGVzdGAgdGFnKSwgd2hpbGUgYW55IG90aGVyIHZhbGlkIHNlbXZlciByYW5nZSByZXNvbHZlcyB0byB0aGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCwgbWF0Y2hpbmcgYG5wbSBpbnN0YWxsYCdzIG1heC1zYXRpc2Z5aW5nIHNlbWFudGljcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZywgcGFja3VtZW50OiBQYWNrdW1lbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmVyc2lvblNwZWNpZmllciAhPT0gJyonICYmIHNlbXZlci52YWxpZFJhbmdlKHZlcnNpb25TcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIHNlbXZlci5tYXhTYXRpc2Z5aW5nKE9iamVjdC5rZXlzKHBhY2t1bWVudC52ZXJzaW9ucyA/PyB7fSksIHZlcnNpb25TcGVjaWZpZXIpID8/IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGFja3VtZW50WydkaXN0LXRhZ3MnXT8uW3ZlcnNpb25TcGVjaWZpZXIgPT09ICcqJyA/ICdsYXRlc3QnIDogdmVyc2lvblNwZWNpZmllcl07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVnaXN0cnlKc29uPFQ+KGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsIHVybDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aCwgdXJsKTtcbiAgcmV0dXJuIChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsIHVybDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAvLyBUYXJiYWxsIFVSTHMgY29tZSBmcm9tIHJlZ2lzdHJ5LWNvbnRyb2xsZWQgbWV0YWRhdGE7IGF0dGFjaCB0aGUgdG9rZW4gb25seSB0byB0aGUgY29uZmlndXJlZFxuICAvLyByZWdpc3RyeSdzIG93biBvcmlnaW4gc28gYSBtYWxpY2lvdXMgb3IgbWlzY29uZmlndXJlZCByZWdpc3RyeSBjYW5ub3QgcmVkaXJlY3QgdGhlIGNyZWRlbnRpYWxcbiAgLy8gdG8gYSB0aGlyZC1wYXJ0eSBob3N0LlxuICBjb25zdCBzZW5kQXV0aFRva2VuID0gISFhdXRoLmF1dGhUb2tlbiAmJiBpc1NhbWVPcmlnaW4odXJsLCBhdXRoLnJlZ2lzdHJ5VXJsKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiBzZW5kQXV0aFRva2VuID8geyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC5hdXRoVG9rZW59YCB9IDoge30sXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luKHVybDogc3RyaW5nLCByZWdpc3RyeVVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsKS5vcmlnaW4gPT09IG5ldyBVUkwocmVnaXN0cnlVcmwpLm9yaWdpbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgnLycsICclMkYnKTtcbn1cblxuLy8gVGhlIG9mZmljaWFsIFNlbVZlciAyLjAuMCBncmFtbWFyIChzZW12ZXIub3JnKSwgYW5jaG9yZWQ6IG51bWVyaWMtbG9va2luZyBkaXN0LXRhZ3Mgc3VjaCBhc1xuLy8gYDEuMi4zbGF0ZXN0YCwgbGVhZGluZy16ZXJvIHZlcnNpb25zIChgMDEuMi4zYCksIGFuZCB1bmRlcnNjb3JlIGlkZW50aWZpZXJzIGFyZSBOT1QgdmVyc2lvbnMg4oCUXG4vLyByZXNvbHZlVmVyc2lvbiB0cmVhdHMgdGhlbSBhcyB0YWdzLCBtYXRjaGluZyBub2RlLXNlbXZlcidzIGNsYXNzaWZpY2F0aW9uLlxuY29uc3QgZXhhY3RTZW12ZXJQYXR0ZXJuID1cbiAgL14oPzowfFsxLTldXFxkKilcXC4oPzowfFsxLTldXFxkKilcXC4oPzowfFsxLTldXFxkKikoPzotKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopPyg/OlxcK1swLTlhLXpBLVotXSsoPzpcXC5bMC05YS16QS1aLV0rKSopPyQvO1xuXG4vKiogV2hldGhlciB0aGUgc3BlY2lmaWVyIGlzIGFuIGV4YWN0IFNlbVZlciB2ZXJzaW9uIChub3QgYSByYW5nZSwgdGFnLCBvciBnaXQgVVJMKS4gKi9cbmZ1bmN0aW9uIGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXNwZWNpZmllciAmJiBleGFjdFNlbXZlclBhdHRlcm4udGVzdChzcGVjaWZpZXIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgRVZFUlkgdmVyc2lvbiBgc3BlY2lmaWVyYCBjYW4gcmVzb2x2ZSB0byBhbHNvIHNhdGlzZmllcyBgcmVxdWlyZW1lbnRgIChleGFjdCB2ZXJzaW9uc1xuICogY291bnQgYXMgc2luZ2xlLXZlcnNpb24gcmFuZ2VzKS4gQ29uZmxpY3QgY2hlY2tzIHVzZSB0aGlzIGJlY2F1c2UgdGhlIGFjdHVhbGx5IHJlc29sdmVkIHZlcnNpb25cbiAqIGlzIHVua25vd24gYmVmb3JlIHRoZSByZWdpc3RyeSBpcyBjb25zdWx0ZWQ6IGEgc3Vic2V0IHNwZWNpZmllcidzIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gaXNcbiAqIGd1YXJhbnRlZWQgdG8gc2F0aXNmeSB0aGUgd2lkZXIgcmVxdWlyZW1lbnQuIE5vbi1yYW5nZSBzcGVjaWZpZXJzIChkaXN0LXRhZ3MsIGdpdCBVUkxzKSBhcmUgbm90XG4gKiBjb21wYXJhYmxlIGFuZCByZXR1cm4gZmFsc2Ug4oCUIGNhbGxlcnMgYWNjZXB0IHRob3NlIG9ubHkgb24gZXhhY3Qgc3RyaW5nIGVxdWFsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BlY2lmaWVyU3Vic2V0KHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXF1aXJlbWVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChzcGVjaWZpZXIgPT09IHVuZGVmaW5lZCB8fCByZXF1aXJlbWVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gIC8vIGAqYCByZXNvbHZlcyB0aHJvdWdoIHRoZSBgbGF0ZXN0YCBkaXN0LXRhZyAoc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQpLCBub3QgYXMgYSByYW5nZSwgc29cbiAgLy8gaXQgaXMgbm90IHN0YXRpY2FsbHkgY29tcGFyYWJsZSBpbiBlaXRoZXIgcG9zaXRpb24uXG4gIGlmIChzcGVjaWZpZXIgPT09ICcqJyB8fCByZXF1aXJlbWVudCA9PT0gJyonKSByZXR1cm4gZmFsc2U7XG4gIC8vIEJ1aWxkIG1ldGFkYXRhIGRpc3Rpbmd1aXNoZXMgcmVnaXN0cnkgYXJ0aWZhY3RzIChyZXNvbHZlVmVyc2lvbiBmZXRjaGVzIGFuIGV4YWN0IHNwZWNpZmllclxuICAvLyB2ZXJiYXRpbSkgYnV0IHNlbXZlciBjb21wYXJpc29ucyBpZ25vcmUgaXQsIHNvIHR3byBleGFjdCB2ZXJzaW9ucyBtdXN0IG1hdGNoIGFzIHN0cmluZ3MuXG4gIGlmIChpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXIpICYmIGlzRXhhY3RWZXJzaW9uKHJlcXVpcmVtZW50KSkgcmV0dXJuIHNwZWNpZmllciA9PT0gcmVxdWlyZW1lbnQ7XG4gIGlmICghc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSB8fCAhc2VtdmVyLnZhbGlkUmFuZ2UocmVxdWlyZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBzZW12ZXIuc3Vic2V0KHNwZWNpZmllciwgcmVxdWlyZW1lbnQpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsaXplZCBgdmVyc2lvbmAgY2FuIGJlIHRoZSByZXNvbHV0aW9uIG9mIHRoZSByZWdpc3RyeSBgc3BlY2lmaWVyYC5cbiAqIERpc3QtdGFncyAoaW52YWxpZCByYW5nZXMpIGFyZSBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYW5kIHBhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzKHNwZWNpZmllcjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQnVpbGQgbWV0YWRhdGEgZGlzdGluZ3Vpc2hlcyByZWdpc3RyeSBhcnRpZmFjdHMsIHNvIGFuIGV4YWN0IHNwZWNpZmllciBhZG1pdHMgb25seSB0aGVcbiAgLy8gaWRlbnRpY2FsIHZlcnNpb24gc3RyaW5nLlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSkgcmV0dXJuIHNwZWNpZmllciA9PT0gdmVyc2lvbjtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXModmVyc2lvbiwgc3BlY2lmaWVyKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBpbnN0YWxsZWQgYHZlcnNpb25gIGlzIHN0YXRpY2FsbHkgS05PV04gdG8gc2F0aXNmeSB0aGUgcmVnaXN0cnkgYHNwZWNpZmllcmAuXG4gKiBEaXN0LXRhZ3MgKGludmFsaWQgcmFuZ2VzKSBhcmUgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFuZCByZXR1cm4gZmFsc2Ug4oCUIHVubGlrZVxuICogbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcywgY2FsbGVycyB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBhbiBpbnN0YWxsZWQgY29weSBjYW4gcmVwbGFjZVxuICogYSByZWdpc3RyeSBkb3dubG9hZCwgc28gdW5jZXJ0YWludHkgbXVzdCBmYWxsIGJhY2sgdG8gZG93bmxvYWRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsZWRWZXJzaW9uU2F0aXNmaWVzKHNwZWNpZmllcjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gYCpgIHJlc29sdmVzIHRocm91Z2ggdGhlIGBsYXRlc3RgIGRpc3QtdGFnIChzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCksIHNvIGxpa2UgYW55IG90aGVyXG4gIC8vIGRpc3QtdGFnIGl0IGlzIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhZ2FpbnN0IGFuIGluc3RhbGxlZCB2ZXJzaW9uLlxuICBpZiAoc3BlY2lmaWVyID09PSAnKicpIHJldHVybiBmYWxzZTtcbiAgLy8gcmVzb2x2ZVZlcnNpb24gZmV0Y2hlcyBhbiBleGFjdCBzcGVjaWZpZXIgdmVyYmF0aW0gKGJ1aWxkIG1ldGFkYXRhIGluY2x1ZGVkKSwgc28gYW4gaW5zdGFsbGVkXG4gIC8vIGNvcHkgbWF5IHJlcGxhY2UgdGhlIGRvd25sb2FkIG9ubHkgd2hlbiB0aGUgdmVyc2lvbiBzdHJpbmdzIG1hdGNoIGV4YWN0bHkuXG4gIGlmIChpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXIpKSByZXR1cm4gc3BlY2lmaWVyID09PSB2ZXJzaW9uO1xuICByZXR1cm4gISFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpICYmIHNlbXZlci5zYXRpc2ZpZXModmVyc2lvbiwgc3BlY2lmaWVyKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgdHlwZSBGb3VuZFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByaXZhdGVSZWdpc3RyeUF1dGggfSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuaW1wb3J0IHtcbiAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlLFxuICBpbnN0YWxsZWRWZXJzaW9uU2F0aXNmaWVzLFxuICBpc1ByaXZhdGVHaXREZXBlbmRlbmN5LFxuICBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3ksXG4gIHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBzcGVjaWZpZXJTdWJzZXQsXG4gIHRvVW5zY29wZWRQYWNrYWdlTmFtZSxcbn0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcblxuaW50ZXJmYWNlIFByaXZhdGVQYWNrYWdlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kOiAnZ2l0JyB8ICdyZWdpc3RyeSc7XG4gIC8qKlxuICAgKiBVbmRlZmluZWQgZm9yIHJlZ2lzdHJ5IHBhY2thZ2VzIHRoYXQgbXVzdCBiZSBkb3dubG9hZGVkOyBzZXQgZm9yIGdpdCBwYWNrYWdlcyBhbmQgZm9yXG4gICAqIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGluc3RhbGxlZCBjb3B5IGluIG5vZGVfbW9kdWxlcyBhbHJlYWR5IHNhdGlzZmllcyB0aGUgc3BlY2lmaWVyXG4gICAqIChzbyBDSSBzdGVwcyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIGNhbiBzdGlsbCBtYXRlcmlhbGl6ZSB0aGVtKS5cbiAgICovXG4gIHNvdXJjZURpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGFyZ2V0RGlyUGF0aDogc3RyaW5nO1xuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gb25jZSBhbiBpbnN0YWxsZWQgY29weSBpcyBzZWxlY3RlZCBvciBhIGRvd25sb2FkIGlzIGV4dHJhY3RlZC4gKi9cbiAgcmVzb2x2ZWRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lLZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ291dC1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdEaXJlY3RvcnkgdG8gY29weSBwcml2YXRlIHBhY2thZ2VzIGludG8nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICdAd2lsbGJvb3N0ZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx7IGRyeVJ1bj86IGJvb2xlYW4gfSwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAtcHJpdmF0ZS1wYWNrYWdlcycsXG4gIGRlc2NyaWJlOlxuICAgICdNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBmb3IgRG9ja2VyIGJ1aWxkczogY29weSBnaXQgZGVwZW5kZW5jaWVzLCByZXVzZSBpbnN0YWxsZWQgQHdpbGxib29zdGVyLXByaXZhdGUvKiByZWdpc3RyeSBwYWNrYWdlcyB3aG9zZSBleGFjdC12ZXJzaW9uIG9yIHNlbXZlci1yYW5nZSBzcGVjaWZpZXIgdGhlIGluc3RhbGxlZCBjb3B5IHNhdGlzZmllcywgYW5kIGRvd25sb2FkIHRoZSByZXN0IChhdXRoIHZpYSAubnBtcmMgLyB+Ly5ucG1yYyBsb2NhbGx5LCBvciBWRVJEQUNDSU9fVE9LRU4gb24gQ0k7IGRpc3QtdGFnIHNwZWNpZmllcnMgc3VjaCBhcyBgbGF0ZXN0YCBhbHdheXMgZG93bmxvYWQpLiAnICtcbiAgICAnVGhlIERvY2tlcmZpbGUgbXVzdCBDT1BZIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMgKGUuZy4gYENPUFkgQHdpbGxib29zdGVyLyBAd2lsbGJvb3N0ZXIvYCBhbmQgYENPUFkgQHdpbGxib29zdGVyLXByaXZhdGUvIEB3aWxsYm9vc3Rlci1wcml2YXRlL2ApIHNvIHRoZSBpbi1pbWFnZSBpbnN0YWxsIHJlc29sdmVzIHRoZSByZXdyaXR0ZW4gZmlsZTogcGF0aHMuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3Qgcm9vdEFuZFNlbGYgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFyb290QW5kU2VsZikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBSZXNvbHZlIHRoZSBkZXNjZW5kYW50IHNldCBmcm9tIHRoZSByZXBvc2l0b3J5IFJPT1QgKG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkpIHNvIHRoZVxuICAgIC8vIGNvbW1hbmQgc2NhbnMgdGhlIHJvb3QgbWFuaWZlc3QgYW5kIGV2ZXJ5IHdvcmtzcGFjZSBtYW5pZmVzdCByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IHJ1bnM6XG4gICAgLy8gZmluZERlc2NlbmRhbnRQcm9qZWN0cyByZXR1cm5zIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCB3aGVuIGludm9rZWQgZnJvbSBhIHdvcmtzcGFjZS5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHJvb3RBbmRTZWxmLnJvb3QuZGlyUGF0aCk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFNjYW4gdGhlIHJvb3QgbWFuaWZlc3QgYW5kIGV2ZXJ5IHdvcmtzcGFjZSBtYW5pZmVzdDogYSBwcml2YXRlIGRlcGVuZGVuY3kgbWF5IGJlIGRlY2xhcmVkIGluXG4gICAgLy8gYSBzdWItcGFja2FnZSAoZS5nLiBwYWNrYWdlcy9zZXJ2ZXIpIHJhdGhlciB0aGFuIHRoZSByb290LCB5ZXQgaXQgc3RpbGwgbWF0ZXJpYWxpemVzIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCBzbyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGAgcmVzb2x2ZXMgaXQgdW5pZm9ybWx5LlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhwcm9qZWN0cy5yb290LmRpclBhdGgsIGNvbGxlY3RNYW5pZmVzdHMocHJvamVjdHMpLCB7XG4gICAgICAgIG91dERpcjogYXJndi5vdXREaXIsXG4gICAgICAgIGRyeVJ1bjogQm9vbGVhbihhcmd2LmRyeVJ1biksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuaW50ZXJmYWNlIE1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzT3B0aW9ucyB7XG4gIC8qKiBEaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpIHRoYXQgZ2l0IGRlcGVuZGVuY2llcyBhcmUgY29waWVkIGludG8uICovXG4gIG91dERpcj86IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSByb290IG1hbmlmZXN0IGZvbGxvd2VkIGJ5IGVhY2ggZGlzdGluY3Qgd29ya3NwYWNlIG1hbmlmZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RNYW5pZmVzdHMocHJvamVjdHM6IEZvdW5kUHJvamVjdHMpOiBQYWNrYWdlSnNvbltdIHtcbiAgY29uc3QgbWFuaWZlc3RzQnlEaXJQYXRoID0gbmV3IE1hcDxzdHJpbmcsIFBhY2thZ2VKc29uPigpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgW3Byb2plY3RzLnJvb3QsIC4uLnByb2plY3RzLmRlc2NlbmRhbnRzXSkge1xuICAgIGlmICghbWFuaWZlc3RzQnlEaXJQYXRoLmhhcyhwcm9qZWN0LmRpclBhdGgpKSBtYW5pZmVzdHNCeURpclBhdGguc2V0KHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wYWNrYWdlSnNvbik7XG4gIH1cbiAgcmV0dXJuIFsuLi5tYW5pZmVzdHNCeURpclBhdGgudmFsdWVzKCldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMoXG4gIHJvb3RQcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3B0aW9uczogTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IG91dERpciA9ICdAd2lsbGJvb3N0ZXInLCBkcnlSdW4gPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAvLyBPdXRwdXQgcGF0aHMgYXJlIHJlY3Vyc2l2ZWx5IERFTEVURUQgYmVmb3JlIGJlaW5nIHJlY3JlYXRlZCwgc28gbm9uZSBvZiB0aGVtIG1heSBjb250YWluIGFcbiAgLy8gc3ltbGluayBjb21wb25lbnQ6IGEgc3ltbGluayAoZS5nLiBgZXNjYXBlIC0+IG5vZGVfbW9kdWxlc2AsIG9yIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZWBcbiAgLy8gaXRzZWxmIGxpbmtpbmcgZWxzZXdoZXJlKSB3b3VsZCBlaXRoZXIgc211Z2dsZSB0aGUgZGVsZXRlIHBhc3QgdGhlIGxleGljYWwgb3ZlcmxhcCBndWFyZHNcbiAgLy8gb3IgZGVzdHJveSB0aGUgc3ltbGluaydzIHRhcmdldC4gUmVqZWN0aW5nIGNhbm9uaWNhbC9sZXhpY2FsIG1pc21hdGNoZXMga2VlcHMgZXZlcnlcbiAgLy8gZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uIG9uIHRoZSBpbnRlbmRlZCBsZXhpY2FsIGxvY2F0aW9uLiBUaGVzZSBndWFyZHMgVEhST1cgKG5vdCBwcm9jZXNzLmV4aXQpXG4gIC8vIHNvIHRoZSBhdXRvbWF0aWMgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlYCBjYWxsZXIgY2FuIGNhdGNoIHRoZW0gYW5kIGNvbnRpbnVlXG4gIC8vIG5vbi1mYXRhbGx5OyB0aGUgZXhwbGljaXQgY29tbWFuZCdzIGhhbmRsZXIgY2F0Y2hlcyBhbmQgZXhpdHMuXG4gIGNvbnN0IHJvb3REaXJQYXRoID0gY2Fub25pY2FsaXplUGF0aChyb290UHJvamVjdERpclBhdGgpO1xuICBjb25zdCByZXNvbHZlT3V0cHV0RGlyUGF0aCA9IChyZWxhdGl2ZU9yQWJzb2x1dGVQYXRoOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGxleGljYWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCByZWxhdGl2ZU9yQWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCBjYW5vbmljYWxQYXRoID0gY2Fub25pY2FsaXplUGF0aChsZXhpY2FsUGF0aCk7XG4gICAgaWYgKGNhbm9uaWNhbFBhdGggIT09IGxleGljYWxQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IG11c3Qgbm90IGNvbnRhaW4gc3ltbGlua3MgKCR7bGV4aWNhbFBhdGh9IHJlc29sdmVzIHRvICR7Y2Fub25pY2FsUGF0aH0pLmApO1xuICAgIH1cbiAgICByZXR1cm4gbGV4aWNhbFBhdGg7XG4gIH07XG4gIGNvbnN0IG91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChvdXREaXIsICctLW91dC1kaXInKTtcbiAgYXNzZXJ0U3ViZGlyZWN0b3J5KHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgLy8gUmVnaXN0cnkgcGFja2FnZXMgYWx3YXlzIG1hdGVyaWFsaXplIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYFxuICAvLyByZXNvbHZlcyB0aGVtIGZyb20gYDxyb290Pi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZWAgcmVnYXJkbGVzcyBvZiBgLS1vdXQtZGlyYC5cbiAgY29uc3QgcmVnaXN0cnlPdXREaXJQYXRoID0gcmVzb2x2ZU91dHB1dERpclBhdGgoXG4gICAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgICBgVGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gb3V0cHV0IGRpcmVjdG9yeWBcbiAgKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgLy8gZS5nLiBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlYCBvciBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlL3N1YmA6IHRoZVxuICAgIC8vIHJlZ2lzdHJ5IHN0ZXAgcmVjdXJzaXZlbHkgZGVsZXRlcyByZWdpc3RyeU91dERpclBhdGgsIHdoaWNoIHdvdWxkIGRlc3Ryb3kgdGhlIGdpdFxuICAgIC8vIHBhY2thZ2VzIGNvcGllZCBpbnRvIGFuIGVxdWFsIG9yIE5FU1RFRCBkaXJlY3RvcnkgbW9tZW50cyBlYXJsaWVyLlxuICAgIHRocm93IG5ldyBFcnJvcihgLS1vdXQtZGlyIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gcmVnaXN0cnkgb3V0cHV0IGRpcmVjdG9yeS5gKTtcbiAgfVxuICBjb25zdCBzdGFnaW5nUm9vdERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChwYXRoLmpvaW4oJy50bXAnLCAnd2ItcHJpdmF0ZS1zdGFnaW5nJyksICdUaGUgc3RhZ2luZyBkaXJlY3RvcnknKTtcbiAgY29uc3QgYmFja3VwUm9vdERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChwYXRoLmpvaW4oJy50bXAnLCAnd2ItcHJpdmF0ZS1iYWNrdXAnKSwgJ1RoZSBiYWNrdXAgZGlyZWN0b3J5Jyk7XG4gIGlmIChwYXRoc092ZXJsYXAob3V0RGlyUGF0aCwgY2Fub25pY2FsaXplUGF0aChwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSkpKSB7XG4gICAgLy8gVGhlIHJlY3Vyc2l2ZSBkZWxldGUgb2Ygb3V0RGlyUGF0aCB3b3VsZCBkZXN0cm95IHRoZSBpbnN0YWxsZWQgc291cmNlcyB0aGUgY29waWVzIHJlYWQuXG4gICAgdGhyb3cgbmV3IEVycm9yKCctLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCBub2RlX21vZHVsZXMuJyk7XG4gIH1cbiAgZm9yIChjb25zdCBbbGFiZWwsIHRlbXBvcmFyeURpclBhdGhdIG9mIFtcbiAgICBbJ3N0YWdpbmcnLCBzdGFnaW5nUm9vdERpclBhdGhdLFxuICAgIFsnYmFja3VwJywgYmFja3VwUm9vdERpclBhdGhdLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCB0ZW1wb3JhcnlEaXJQYXRoKSB8fCBwYXRoc092ZXJsYXAocmVnaXN0cnlPdXREaXJQYXRoLCB0ZW1wb3JhcnlEaXJQYXRoKSkge1xuICAgICAgLy8gQm90aCBkaXJlY3RvcmllcyBhcmUgcmVjdXJzaXZlbHkgcmVjcmVhdGVkLCBzaWxlbnRseSBkaXNjYXJkaW5nIGFueXRoaW5nIG1hdGVyaWFsaXplZCBpbnRvXG4gICAgICAvLyBhbiBlcXVhbCBvciBuZXN0ZWQgb3V0cHV0IGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBkaXJlY3RvcmllcyBtdXN0IG5vdCBvdmVybGFwIHRoZSAke2xhYmVsfSBkaXJlY3RvcnkgKCR7dGVtcG9yYXJ5RGlyUGF0aH0pLmApO1xuICAgIH1cbiAgfVxuICAvLyBTdGFnaW5nIE1JUlJPUlMgZWFjaCBvdXRwdXQgdHJlZSdzIHJlcG9zaXRvcnktcm9vdC1yZWxhdGl2ZSBsb2NhdGlvbiAoZS5nLlxuICAvLyBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlL2FgIHN0YWdlcyBhdCBgPHN0YWdpbmc+L0B3aWxsYm9vc3Rlci1wcml2YXRlL2FgKSwgc28gdGhlIHJlbGF0aXZlXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gYW55IHR3byBzdGFnZWQgdHJlZXMgZXF1YWxzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZWlyIGZpbmFsIGxvY2F0aW9ucy4gVGhhdFxuICAvLyBtYWtlcyBjcm9zcy10cmVlIGBmaWxlOmAgcmV3cml0ZXMgKGUuZy4gYC4uLy4uL0B3aWxsYm9vc3Rlci88bmFtZT5gKSBjb21wdXRlZCBhZ2FpbnN0IHN0YWdpbmdcbiAgLy8gY29ycmVjdCBhZnRlciB0aGUgc3dhcCwgd2hpY2ggbGV0cyBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXAg4oCUIGRvd25sb2FkLCBleHRyYWN0aW9uLCBuZXN0ZWRcbiAgLy8gZGlzY292ZXJ5LCByZXdyaXRpbmcg4oCUIGZpbmlzaCBiZWZvcmUgZWl0aGVyIGxpdmUgdHJlZSBpcyB0b3VjaGVkLlxuICBjb25zdCB0b1N0YWdlZFBhdGggPSAoZmluYWxQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICBwYXRoLmpvaW4oc3RhZ2luZ1Jvb3REaXJQYXRoLCBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBmaW5hbFBhdGgpKTtcbiAgaWYgKHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpICE9PSAnQHdpbGxib29zdGVyJykge1xuICAgIC8vIFByZS1leGlzdGluZyBsaW1pdGF0aW9uIG9mIHRoZSBvcHRpb246IHRoZSBEb2NrZXIgbWFuaWZlc3QgcmV3cml0ZSBoYXMgbm8gYWNjZXNzIHRvIGl0LlxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgJ05vdGU6IHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgcmV3cml0ZXMgZ2l0IGRlcGVuZGVuY2llcyB0byA8cm9vdD4vQHdpbGxib29zdGVyOyBhIGN1c3RvbSAtLW91dC1kaXIgcmVxdWlyZXMgYSBtYXRjaGluZyBEb2NrZXJmaWxlIGxheW91dC4nXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBhd2FpdCBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICAgIHJvb3REaXJQYXRoLFxuICAgIG1hbmlmZXN0UGFja2FnZUpzb25zLFxuICAgIG91dERpclBhdGgsXG4gICAgcmVnaXN0cnlPdXREaXJQYXRoXG4gICk7XG5cbiAgaWYgKGRyeVJ1bikge1xuICAgIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGgsIHByaXZhdGVQYWNrYWdlcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXIgYXJlIGNvcGllZCBmcm9tXG4gIC8vIG5vZGVfbW9kdWxlczsgb25seSB0aGUgcmVzdCBhcmUgZG93bmxvYWRlZCwgc28gcmVnaXN0cnkgY3JlZGVudGlhbHMgYXJlIG5lZWRlZCBvbmx5IHdoZW4gYVxuICAvLyBkb3dubG9hZCBhY3R1YWxseSBoYXBwZW5zIChDSSB0ZXN0IHN0ZXBzIGRlbGliZXJhdGVseSByZWNlaXZlIG5vIFZlcmRhY2NpbyB0b2tlbikuXG4gIGNvbnN0IGRvd25sb2FkZWRQYWNrYWdlcyA9IFsuLi5wcml2YXRlUGFja2FnZXMudmFsdWVzKCldLmZpbHRlcigocCkgPT4gcC5raW5kID09PSAncmVnaXN0cnknICYmICFwLnNvdXJjZURpclBhdGgpO1xuICAvLyBSZXNvbHZlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gQkVGT1JFIGRlbGV0aW5nIHRoZSBleGlzdGluZyBtYXRlcmlhbGl6YXRpb25zLCBzbyBhIG1pc3NpbmdcbiAgLy8gcmVnaXN0cnkgY29uZmlndXJhdGlvbiBjYW5ub3QgZGVzdHJveSBhIHByZXZpb3VzbHkgdXNhYmxlIG91dHB1dCB0cmVlLiBUaHJvdyAocmF0aGVyIHRoYW5cbiAgLy8gZXhpdCkgc28gY2FsbGVycyBjYW4gZGVjaWRlOiBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgcmVwb3J0cyBpdCBhbmQgZXhpdHMsIHdoaWxlIHRoZVxuICAvLyBhdXRvbWF0aWMgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlYCBzdGVwIGNhdGNoZXMgaXQgYW5kIGNvbnRpbnVlcywgbGVhdmluZyB0aGVcbiAgLy8gZXhpc3Rpbmcgb3V0cHV0IHVudG91Y2hlZCAobm90aGluZyBoYXMgYmVlbiBkZWxldGVkIHlldCBhdCB0aGlzIHBvaW50KS5cbiAgY29uc3QgYXV0aCA9IGRvd25sb2FkZWRQYWNrYWdlcy5sZW5ndGggPiAwID8gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGgpIDogdW5kZWZpbmVkO1xuICBpZiAoZG93bmxvYWRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgJiYgIWF1dGg/LmF1dGhUb2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZG93bmxvYWQgJHtkb3dubG9hZGVkUGFja2FnZXMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oJywgJyl9OiBydW4gd2JmeSB0byBnZW5lcmF0ZSB0aGUgcmVwb3NpdG9yeSAubnBtcmMgYW5kIGNvbmZpZ3VyZSBpdHMgdG9rZW4gaW4gfi8ubnBtcmMgKG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSSkuIGAgK1xuICAgICAgICBgT25seSBpbnN0YWxsZWQgY29waWVzIHNhdGlzZnlpbmcgYW4gZXhhY3QgdmVyc2lvbiBvciBgICtcbiAgICAgICAgJ3NlbXZlciByYW5nZSBhcmUgcmV1c2VkIHdpdGhvdXQgcmVnaXN0cnkgYWNjZXNzOyBkaXN0LXRhZyBzcGVjaWZpZXJzIChlLmcuIGBsYXRlc3RgKSBhbHdheXMgcmVxdWlyZSBpdC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvcGllZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdnaXQnKTtcbiAgY29uc3QgcmVnaXN0cnlQYWNrYWdlcyA9IFsuLi5wcml2YXRlUGFja2FnZXMudmFsdWVzKCldLmZpbHRlcigocCkgPT4gcC5raW5kID09PSAncmVnaXN0cnknKTtcblxuICAvLyBNYXRlcmlhbGl6ZSBCT1RIIHRyZWVzIGludG8gc3RhZ2luZyBhbmQgc3dhcCB0aGVtIGluIG9ubHkgYWZ0ZXIgZXZlcnkgZmFpbHVyZS1wcm9uZSBzdGVwXG4gIC8vIHN1Y2NlZWRlZDogYSByZWdpc3RyeSBmZXRjaC9leHRyYWN0aW9uL25lc3RlZC1kaXNjb3ZlcnkvcmV3cml0ZSBmYWlsdXJlIG11c3QgbGVhdmUgYm90aCBsaXZlXG4gIC8vIHRyZWVzIGV4YWN0bHkgYXMgdGhleSB3ZXJlLiBPdGhlcndpc2UgdGhlIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgXG4gIC8vIGNhbGxlciDigJQgd2hpY2ggY2F0Y2hlcyB0aGUgZmFpbHVyZSBhbmQgY29udGludWVzIOKAlCB3b3VsZCByZXdyaXRlIGRlcGVuZGVuY2llcyBhZ2FpbnN0XG4gIC8vIGluY29uc2lzdGVudCB0cmVlcyAoZS5nLiBhIHJlZ2lzdHJ5IG1hbmlmZXN0IHBvaW50aW5nIGF0IGEgZGVsZXRlZCBgQHdpbGxib29zdGVyLzxuYW1lPmApLlxuICBhd2FpdCBmcy5wcm9taXNlcy5ybShzdGFnaW5nUm9vdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgdHJ5IHtcbiAgICAvLyBCb3RoIG91dHB1dCBkaXJlY3RvcmllcyBhbHdheXMgZXhpc3QgYWZ0ZXJ3YXJkczogRG9ja2VyZmlsZXMgQ09QWSB0aGVtIHVuY29uZGl0aW9uYWxseSwgYW5kXG4gICAgLy8gYSBtaXNzaW5nIHNvdXJjZSBwYXRoIGZhaWxzIHRoZSBidWlsZC5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0b1N0YWdlZFBhdGgob3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRvU3RhZ2VkUGF0aChyZWdpc3RyeU91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIGNvcGllZFBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgcmVnaXN0cnlQYWNrYWdlcykge1xuICAgICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLCB0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgICAgICAgLy8gZG93bmxvYWRlZFBhY2thZ2VzIGlzIG5vbi1lbXB0eSBvbiB0aGlzIHBhdGgsIHNvIHRoZSBhdXRoIGNoZWNrIGFib3ZlIHBhc3NlZC5cbiAgICAgICAgYXV0aCEsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLm5hbWUsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKVxuICAgICAgKTtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IHJlYWRJbnN0YWxsZWRWZXJzaW9uKFxuICAgICAgICB0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCksXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLm5hbWVcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmluZm8oYERvd25sb2FkZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xuICAgICAgLy8gQSBkb3dubG9hZGVkIHBhY2thZ2UgbWF5IGl0c2VsZiBkZXBlbmQgb24gcHJpdmF0ZSBwYWNrYWdlcyB0aGF0IHdlcmUgbm90IHZpc2libGUgYmVmb3JlXG4gICAgICAvLyBleHRyYWN0aW9uOyBtYXRlcmlhbGl6ZSB0aGVtIHRvby4gSW5zdGFsbGVkIGNvcGllcyB3ZXJlIGFscmVhZHkgZGVlcC1zY2FubmVkIGJ5XG4gICAgICAvLyBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzLlxuICAgICAgYXdhaXQgY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgIGF1dGghLFxuICAgICAgICBwcml2YXRlUGFja2FnZSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICByZWdpc3RyeU91dERpclBhdGgsXG4gICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXBsYWNlUHJpdmF0ZURlcGVuZGVuY2llcyhzdGFnaW5nUm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlcywgdG9TdGFnZWRQYXRoKTtcbiAgICBhd2FpdCBzd2FwTWF0ZXJpYWxpemVkVHJlZXMoW291dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aF0sIHRvU3RhZ2VkUGF0aCwgYmFja3VwUm9vdERpclBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdSb290RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhcbiAgICBgRW5zdXJlIHRoZSBEb2NrZXJmaWxlIENPUFlzICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCl9LyBhbmQgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS8gaW50byB0aGUgaW1hZ2UgYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLmBcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgbWFuaWZlc3RQYWNrYWdlSnNvbnM6IFBhY2thZ2VKc29uW10sXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgcmVnaXN0cnlPdXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8TWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+PiB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgLy8gU2VlZCBmcm9tIGV2ZXJ5IG1hbmlmZXN0IChyb290ICsgd29ya3NwYWNlcyk7IG9uZSBwcml2YXRlIHBhY2thZ2UgbWF5IGJlIHJlcXVlc3RlZCBieSBzZXZlcmFsXG4gIC8vIG1hbmlmZXN0cywgc28gbWVyZ2UgZHVwbGljYXRlcyB0aGUgc2FtZSB3YXkgbmVzdGVkIGRpc2NvdmVyeSBkb2VzIOKAlCBrZWVwIHRoZSBuYXJyb3dlclxuICAvLyBjb21wYXRpYmxlIHJlcXVpcmVtZW50IGFuZCBmYWlsIGxvdWRseSBvbiBhIGdlbnVpbmUgY29uZmxpY3QuXG4gIGNvbnN0IHBhY2thZ2VzVG9Qcm9jZXNzOiBQcml2YXRlUGFja2FnZVtdID0gW107XG4gIGNvbnN0IHF1ZXVlZFBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uIG9mIG1hbmlmZXN0UGFja2FnZUpzb25zKSB7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0ZWQgb2YgZmluZFByaXZhdGVEZXBlbmRlbmNpZXMocGFja2FnZUpzb24sIG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IHF1ZXVlZCA9IHF1ZXVlZFBhY2thZ2VzLmdldChyZXF1ZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoIXF1ZXVlZCkge1xuICAgICAgICBxdWV1ZWRQYWNrYWdlcy5zZXQocmVxdWVzdGVkLm5hbWUsIHJlcXVlc3RlZCk7XG4gICAgICAgIHBhY2thZ2VzVG9Qcm9jZXNzLnB1c2gocmVxdWVzdGVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KHF1ZXVlZCwgcmVxdWVzdGVkKTtcbiAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KHF1ZXVlZCwgcmVxdWVzdGVkLCBwYWNrYWdlSnNvbi5uYW1lID8/ICdhIHdvcmtzcGFjZSBtYW5pZmVzdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVkLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwYWNrYWdlc1RvUHJvY2Vzcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwcml2YXRlUGFja2FnZSA9IHBhY2thZ2VzVG9Qcm9jZXNzW2luZGV4XTtcbiAgICBpZiAoIXByaXZhdGVQYWNrYWdlKSBjb250aW51ZTtcbiAgICBpZiAocHJpdmF0ZVBhY2thZ2VzLmhhcyhwcml2YXRlUGFja2FnZS5uYW1lKSkgY29udGludWU7XG5cbiAgICBpZiAocHJpdmF0ZVBhY2thZ2Uua2luZCA9PT0gJ2dpdCcpIHtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGggPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbGxlZCA9IGZpbmRJbnN0YWxsZWRSZWdpc3RyeVBhY2thZ2Uocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlKTtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGggPSBpbnN0YWxsZWQ/LmRpclBhdGg7XG4gICAgICBwcml2YXRlUGFja2FnZS5yZXNvbHZlZFZlcnNpb24gPSBpbnN0YWxsZWQ/LnZlcnNpb247XG4gICAgfVxuICAgIC8vIFNlbGVjdGVkIEJFRk9SRSB0aGUgZGVlcCBzY2FuOiBhIG1hbmlmZXN0IGluc2lkZSB0aGUgcGFja2FnZSBtYXkgcmVmZXIgYmFjayB0byB0aGUgcGFja2FnZVxuICAgIC8vIGl0c2VsZiwgYW5kIHRoYXQgcmVxdWlyZW1lbnQgbXVzdCBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIChhc3NlcnROb1ZlcnNpb25Db25mbGljdFxuICAgIC8vIGJlbG93KSwgbmV2ZXIgbmFycm93IHRoZSBhbHJlYWR5LXNlbGVjdGVkIHNwZWNpZmllci5cbiAgICBwcml2YXRlUGFja2FnZXMuc2V0KHByaXZhdGVQYWNrYWdlLm5hbWUsIHByaXZhdGVQYWNrYWdlKTtcbiAgICAvLyBOZXN0ZWQgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgb2YgYW4gaW5zdGFsbGVkIHBhY2thZ2UgYXJlIGRpc2NvdmVyYWJsZSByaWdodCBhd2F5OyByZWdpc3RyeVxuICAgIC8vIHBhY2thZ2VzIHdpdGhvdXQgYSB1c2FibGUgaW5zdGFsbGVkIGNvcHkgYXJlIGluc3BlY3RlZCBhZnRlciBkb3dubG9hZCBpbnN0ZWFkXG4gICAgLy8gKGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMpLlxuICAgIGlmIChwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlZCA9IHF1ZXVlZFBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICAgICAgaWYgKCFxdWV1ZWQpIHtcbiAgICAgICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChuZXN0ZWQubmFtZSwgbmVzdGVkKTtcbiAgICAgICAgICAgIHBhY2thZ2VzVG9Qcm9jZXNzLnB1c2gobmVzdGVkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJpdmF0ZVBhY2thZ2VzLmhhcyhuZXN0ZWQubmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgbWF0ZXJpYWxpemVkIChvciBzZWxlY3RlZCk6IHRoZSByZXF1aXJlbWVudCBtdXN0IGFkbWl0IHRoYXQgc2VsZWN0aW9uLlxuICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBxdWV1ZWQ6IGtlZXAgdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQgc28gZGlzY292ZXJ5IG9yZGVyIGNhbm5vdFxuICAgICAgICAgICAgLy8gdHVybiBjb21wYXRpYmxlIGNvbnN0cmFpbnRzIChlLmcuIGBeMS4wLjBgIGFuZCBgMS4yLjNgKSBpbnRvIGEgc3B1cmlvdXMgY29uZmxpY3QuXG4gICAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KHF1ZXVlZCwgbmVzdGVkKTtcbiAgICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KHF1ZXVlZCwgbmVzdGVkLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHF1ZXVlZC52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJpdmF0ZVBhY2thZ2VzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBleHRyYWN0ZWRQYWNrYWdlOiBQcml2YXRlUGFja2FnZSxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgcmVnaXN0cnlPdXREaXJQYXRoOiBzdHJpbmcsXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRXZlcnkgbWF0ZXJpYWxpemVkIHBhY2thZ2Ug4oCUIGluY2x1ZGluZyBhIGxhdGUtZGlzY292ZXJlZCBuZXN0ZWQgZ2l0IGRlcGVuZGVuY3kg4oCUIGxpdmVzIGluXG4gIC8vIHN0YWdpbmcgdW50aWwgdGhlIGF0b21pYyBzd2FwLCBzbyBpdHMgbWFuaWZlc3RzIG11c3QgYmUgcmVhZCB0aGVyZS5cbiAgY29uc3QgZXh0cmFjdGVkRGlyUGF0aCA9IHRvU3RhZ2VkUGF0aChleHRyYWN0ZWRQYWNrYWdlLnRhcmdldERpclBhdGgpO1xuICAvLyBTY2FuIEVWRVJZIG1hbmlmZXN0IG9mIHRoZSBtYXRlcmlhbGl6ZWQgcGFja2FnZSAob3JnIGdpdCBkZXBlbmRlbmNpZXMgYXJlIHdob2xlIG1vbm9yZXBvXG4gIC8vIGNoZWNrb3V0cyB3aXRoIHBhY2thZ2VzLyovcGFja2FnZS5qc29uKSwgbWlycm9yaW5nIGNvbGxlY3RQcml2YXRlUGFja2FnZXMnIGRlZXAgc2NhbiDigJQgdGhlXG4gIC8vIGRlcGVuZGVuY3ktcmV3cml0ZSBzdGVwIHdhbGtzIHRoZSBzYW1lIHNldCwgc28gYW55dGhpbmcgZGVjbGFyZWQgdGhlcmUgbXVzdCBiZSBtYXRlcmlhbGl6ZWQuXG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGV4dHJhY3RlZERpclBhdGgpKSB7XG4gICAgZm9yIChjb25zdCBuZXN0ZWQgb2YgZmluZFByaXZhdGVEZXBlbmRlbmNpZXMoXG4gICAgICBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKSxcbiAgICAgIG91dERpclBhdGgsXG4gICAgICByZWdpc3RyeU91dERpclBhdGhcbiAgICApKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmVzdGVkLm5hbWUpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIGlmIChleGlzdGluZy5raW5kID09PSAncmVnaXN0cnknICYmICFleGlzdGluZy5zb3VyY2VEaXJQYXRoICYmIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU3RpbGwgYXdhaXRpbmcgaXRzIGRvd25sb2FkIChubyBpbnN0YWxsZWQgY29weSBzZWxlY3RlZCwgbm90aGluZyBleHRyYWN0ZWQgeWV0KToga2VlcFxuICAgICAgICAgIC8vIHRoZSBOQVJST1dFUiBjb21wYXRpYmxlIHJlcXVpcmVtZW50LCBleGFjdGx5IGFzIGNvbGxlY3RQcml2YXRlUGFja2FnZXMgZG9lcyBmb3JcbiAgICAgICAgICAvLyBxdWV1ZWQgcGFja2FnZXMsIHNvIGxhdGUtZGlzY292ZXJlZCBuZXN0ZWQgY29uc3RyYWludHMgY2Fubm90IGZhYnJpY2F0ZSBjb25mbGljdHMuXG4gICAgICAgICAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChleGlzdGluZywgbmVzdGVkKTtcbiAgICAgICAgICBpZiAobmFycm93ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QoZXhpc3RpbmcsIG5lc3RlZCwgZXh0cmFjdGVkUGFja2FnZS5uYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENvbGxhcHNpbmcgZGlmZmVyZW50IHJlcXVlc3RlZCB2ZXJzaW9ucyBpbnRvIG9uZSBtYXRlcmlhbGl6YXRpb24gd291bGQgc2lsZW50bHlcbiAgICAgICAgICAvLyB2aW9sYXRlIHRoZSBkZXBlbmRlbnQncyByZXF1aXJlbWVudCwgc28gY29uZmxpY3RzIG11c3QgZmFpbCBsb3VkbHkuXG4gICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QoZXhpc3RpbmcsIG5lc3RlZCwgZXh0cmFjdGVkUGFja2FnZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5lc3RlZC5raW5kID09PSAnZ2l0Jykge1xuICAgICAgICBuZXN0ZWQuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBuZXN0ZWQubmFtZSk7XG4gICAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQsIHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgbmVzdGVkKTtcbiAgICAgICAgbmVzdGVkLnNvdXJjZURpclBhdGggPSBpbnN0YWxsZWQ/LmRpclBhdGg7XG4gICAgICAgIG5lc3RlZC5yZXNvbHZlZFZlcnNpb24gPSBpbnN0YWxsZWQ/LnZlcnNpb247XG4gICAgICAgIGlmIChuZXN0ZWQuc291cmNlRGlyUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQsIHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICBuZXN0ZWQubmFtZSxcbiAgICAgICAgICAgIG5lc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnLFxuICAgICAgICAgICAgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IHJlYWRJbnN0YWxsZWRWZXJzaW9uKHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aCksIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYERvd25sb2FkZWQgJHtuZXN0ZWQubmFtZX0gKG5lc3RlZCBkZXBlbmRlbmN5KSB0byAke25lc3RlZC50YXJnZXREaXJQYXRofWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgYXdhaXQgY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICByZWdpc3RyeU91dERpclBhdGgsXG4gICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIGBkZXN0aW5hdGlvbkRpclBhdGhgIG1heSBkaWZmZXIgZnJvbSBgdGFyZ2V0RGlyUGF0aGAgd2hpbGUgcmVnaXN0cnkgcGFja2FnZXMgc3RhZ2UuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5SW5zdGFsbGVkUGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBkZXN0aW5hdGlvbkRpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgcmVnaXN0cnkgcGFja2FnZSdzIHRhcmJhbGwgbWF5IGxlZ2l0aW1hdGVseSBjb250YWluIG5vZGVfbW9kdWxlcy8gY29udGVudCB2aWFcbiAgLy8gYnVuZGxlZERlcGVuZGVuY2llczsgdGhvc2UgZmlsZXMgYXJlIHBhcnQgb2YgdGhlIGFydGlmYWN0IGFuZCBtdXN0IHN1cnZpdmUgdGhlIGNvcHkuIEdpdFxuICAvLyBjaGVja291dHMgKGFuZCBub24tYnVuZGxlZCBuYW1lcykgc3RpbGwgZXhjbHVkZSBub2RlX21vZHVsZXMsIHdoaWNoIGhvbGRzIGxvY2FsbHkgaW5zdGFsbGVkXG4gIC8vIGRlcGVuZGVuY2llcyB0aGVyZS5cbiAgY29uc3QgYnVuZGxlZERlcGVuZGVuY3lOYW1lcyA9XG4gICAgcHJpdmF0ZVBhY2thZ2Uua2luZCA9PT0gJ3JlZ2lzdHJ5JyA/IHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghKSA6IFtdO1xuICBhd2FpdCBmcy5wcm9taXNlcy5jcChwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISwgZGVzdGluYXRpb25EaXJQYXRoLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIGZvcmNlOiB0cnVlLFxuICAgIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciBleHBvc2VzIGluc3RhbGxlZCBwYWNrYWdlcyB0aHJvdWdoIHN5bWxpbmtzOyB0aGUgbWF0ZXJpYWxpemVkIHRyZWVcbiAgICAvLyBtdXN0IGNvbnRhaW4gcmVhbCBmaWxlcyAoYSBjb3BpZWQgYWJzb2x1dGUgc3ltbGluayB3b3VsZCBkYW5nbGUgaW5zaWRlIHRoZSBEb2NrZXIgaW1hZ2UsXG4gICAgLy8gYW5kIGxhdGVyIGRlcGVuZGVuY3kgcmV3cml0aW5nIHdvdWxkIHdyaXRlIHRocm91Z2ggaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlKS5cbiAgICBkZXJlZmVyZW5jZTogdHJ1ZSxcbiAgICBmaWx0ZXI6IChzcmMpID0+IHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5yZWxhdGl2ZShwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISwgc3JjKS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICBpZiAoc2VnbWVudHMuaW5jbHVkZXMoJy5naXQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgbm9kZU1vZHVsZXNJbmRleCA9IHNlZ21lbnRzLmluZGV4T2YoJ25vZGVfbW9kdWxlcycpO1xuICAgICAgaWYgKG5vZGVNb2R1bGVzSW5kZXggPT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChidW5kbGVkRGVwZW5kZW5jeU5hbWVzID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVGhlIG5vZGVfbW9kdWxlcyAoYW5kIEBzY29wZSkgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyBtdXN0IGNvcHkgc28gYnVuZGxlZCBzdWJ0cmVlcyBjYW47XG4gICAgICAvLyBvbmx5IHRoZSBmaXJzdCBub2RlX21vZHVsZXMgbGV2ZWwgZmlsdGVycyDigJQgYW55dGhpbmcgaW5zaWRlIGEgYnVuZGxlZCBzdWJ0cmVlIGJlbG9uZ3MgdG9cbiAgICAgIC8vIHRoZSBhcnRpZmFjdCwgaW5jbHVkaW5nIGl0cyBvd24gbmVzdGVkIG5vZGVfbW9kdWxlcy5cbiAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHNlZ21lbnRzLnNsaWNlKG5vZGVNb2R1bGVzSW5kZXggKyAxKTtcbiAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChmaXJzdC5zdGFydHNXaXRoKCdAJykgJiYgc2Vjb25kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKGAke2ZpcnN0fS9gKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSA/IGAke2ZpcnN0fS8ke3NlY29uZH1gIDogZmlyc3Q7XG4gICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5pbmNsdWRlcyhwYWNrYWdlTmFtZSk7XG4gICAgfSxcbiAgfSk7XG4gIGNvbnNvbGUuaW5mbyhgQ29waWVkICR7cHJpdmF0ZVBhY2thZ2UubmFtZX0gdG8gJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKX1gKTtcbn1cblxuLyoqIERlY2xhcmVkIGJ1bmRsZWQgZGVwZW5kZW5jeSBuYW1lcyBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2U7IGB0cnVlYCBidW5kbGVzIGV2ZXJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiByZWFkQnVuZGxlZERlcGVuZGVuY3lOYW1lcyhzb3VyY2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHRydWUge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHNvdXJjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgICAgYnVuZGxlRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgICAgYnVuZGxlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIHwgYm9vbGVhbjtcbiAgICB9O1xuICAgIGNvbnN0IGJ1bmRsZWQgPSBwYWNrYWdlSnNvbi5idW5kbGVEZXBlbmRlbmNpZXMgPz8gcGFja2FnZUpzb24uYnVuZGxlZERlcGVuZGVuY2llcztcbiAgICBpZiAoYnVuZGxlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYnVuZGxlZCkgPyBidW5kbGVkLmZpbHRlcigobmFtZSkgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSA6IFtdO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbWF0ZXJpYWxpemF0aW9uIGZvciBgZXhpc3RpbmdgIGlzIGFscmVhZHkgc2VsZWN0ZWQgKGEgcmFuZ2UgcmVzb2x2ZXMgbWF4LXNhdGlzZnlpbmcgYWdhaW5zdFxuICogdGhlIHJlZ2lzdHJ5IOKAlCBzZWUgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKSwgc28gYWNjZXB0IGByZXF1ZXN0ZWRgIG9ubHkgd2hlbiBpdCBpc1xuICogZ3VhcmFudGVlZCBzYXRpc2ZpZWQ6IGBleGlzdGluZ2AgbXVzdCBiZSBhIHN1YnNldCBvZiBpdCAoZXZlcnkgcG9zc2libGUgcmVzb2x1dGlvbiBvZiBgZXhpc3RpbmdgXG4gKiB0aGVuIHNhdGlzZmllcyBgcmVxdWVzdGVkYCkuIE5vbi1yYW5nZSBzcGVjaWZpZXJzIChkaXN0LXRhZ3MsIGdpdCBVUkxzL3JldmlzaW9ucykgbXVzdCBtYXRjaFxuICogZXhhY3RseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QoZXhpc3Rpbmc6IFByaXZhdGVQYWNrYWdlLCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlLCBkZXBlbmRlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgPT09IHJlcXVlc3RlZC5raW5kKSB7XG4gICAgaWYgKGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPT09IHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSByZXR1cm47XG4gICAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybjtcbiAgICAvLyBPbmNlIHRoZSBjb25jcmV0ZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBpcyBrbm93biAoaW5zdGFsbGVkIGNvcHkgb3IgZXh0cmFjdGVkIGRvd25sb2FkKSwgYVxuICAgIC8vIHJlcXVpcmVtZW50IGl0IHNhdGlzZmllcyBpcyBjb21wYXRpYmxlIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwgc3BlY2lmaWVycyBhcmUgbm90IHN1YnNldHNcbiAgICAvLyAoZS5nLiBgXjEuMC4wYCByZXNvbHZlZCB0byAxLjIuMyBhbHNvIHNhdGlzZmllcyBhIGxhdGVyIGV4YWN0IGAxLjIuM2ApLlxuICAgIGlmIChcbiAgICAgIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YWxsZWRWZXJzaW9uU2F0aXNmaWVzKHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyLCBleGlzdGluZy5yZXNvbHZlZFZlcnNpb24pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDb25mbGljdGluZyByZXF1aXJlbWVudHMgZm9yICR7ZXhpc3RpbmcubmFtZX06IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSBpcyBhbHJlYWR5IHNlbGVjdGVkLCBidXQgJHtkZXBlbmRlbnROYW1lfSByZXF1aXJlcyBgICtcbiAgICAgIGAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS4gT25seSBhIHNpbmdsZSB2ZXJzaW9uIHBlciBwcml2YXRlIHBhY2thZ2UgaXMgc3VwcG9ydGVkLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBzeW1saW5rcyBpbiB0aGUgZGVlcGVzdCBFWElTVElORyBhbmNlc3RvciBvZiB0aGUgcGF0aCBhbmQgcmVhdHRhY2hlcyB0aGUgbm90LXlldFxuICogZXhpc3RpbmcgcmVtYWluZGVyLCBzbyBsZXhpY2FsIGNvbnRhaW5tZW50L292ZXJsYXAgY2hlY2tzIG9wZXJhdGUgb24gcGh5c2ljYWwgbG9jYXRpb25zLlxuICovXG5mdW5jdGlvbiBjYW5vbmljYWxpemVQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBleGlzdGluZ1BhdGggPSBwYXRoLnJlc29sdmUodGFyZ2V0UGF0aCk7XG4gIGNvbnN0IHJlbWFpbmRlclNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoZXhpc3RpbmdQYXRoKSkge1xuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoZXhpc3RpbmdQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gZXhpc3RpbmdQYXRoKSBicmVhaztcbiAgICByZW1haW5kZXJTZWdtZW50cy51bnNoaWZ0KHBhdGguYmFzZW5hbWUoZXhpc3RpbmdQYXRoKSk7XG4gICAgZXhpc3RpbmdQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKGV4aXN0aW5nUGF0aCksIC4uLnJlbWFpbmRlclNlZ21lbnRzKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgfVxufVxuXG4vKiogV2hldGhlciB0aGUgdHdvIHBhdGhzIGFyZSBlcXVhbCBvciBvbmUgY29udGFpbnMgdGhlIG90aGVyLiAqL1xuZnVuY3Rpb24gcGF0aHNPdmVybGFwKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYSwgYikgfHwgaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGIsIGEpO1xufVxuXG5mdW5jdGlvbiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYW5jZXN0b3JQYXRoOiBzdHJpbmcsIGRlc2NlbmRhbnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShhbmNlc3RvclBhdGgsIGRlc2NlbmRhbnRQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCA9PT0gJycgfHwgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGg6IHN0cmluZywgb3V0RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICBpZiAocmVsYXRpdmVQYXRoICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHJldHVybjtcblxuICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBkaXJlY3RvcnkgbXVzdCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCByb290OiAke291dERpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpO1xuICAvLyByZWFscGF0aFN5bmMgcmVzb2x2ZXMgdGhlIGlzb2xhdGVkIGxpbmtlcidzIHN5bWxpbmsgc28gY29waWVzIHJlYWQgKGFuZCB0aGUgY29weSBmaWx0ZXJcbiAgLy8gY29tcHV0ZXMgcmVsYXRpdmUgcGF0aHMgYWdhaW5zdCkgdGhlIGFjdHVhbCBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgY29uc3QgZGlyZWN0RGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAd2lsbGJvb3N0ZXInLCB1bnNjb3BlZE5hbWUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyZWN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHJldHVybiBmcy5yZWFscGF0aFN5bmMoZGlyZWN0RGlyUGF0aCk7XG4gIH1cbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGtlZXBzIHRyYW5zaXRpdmUtb25seSBkZXBlbmRlbmNpZXMgb3V0IG9mIHRoZSByb290IG5vZGVfbW9kdWxlcztcbiAgLy8gc2VhcmNoIHRoZSAuYnVuIHN0b3JlIGZvciB0aGUgcGFja2FnZSBiZWZvcmUgZ2l2aW5nIHVwLiBUaGUgc3RvcmUgbWF5IGxlZ2l0aW1hdGVseSBob2xkXG4gIC8vIE1VTFRJUExFIHJlc29sdXRpb25zIG9mIG9uZSBwYWNrYWdlIChkaWZmZXJlbnQgdmVyc2lvbnMvcmV2aXNpb25zKSwgYW5kIHBpY2tpbmcgYW4gYXJiaXRyYXJ5XG4gIC8vIG9uZSBjb3VsZCBzaWxlbnRseSBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudCDigJQgc28gYW1iaWd1aXR5IGZhaWxzIGxvdWRseS5cbiAgY29uc3QgYnVuU3RvcmVEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5idW4nKTtcbiAgY29uc3QgY2FuZGlkYXRlRGlyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhidW5TdG9yZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgY2FuZGlkYXRlRGlyUGF0aCA9IHBhdGguam9pbihidW5TdG9yZURpclBhdGgsIGRpcmVudC5uYW1lLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY2FuZGlkYXRlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICBjYW5kaWRhdGVEaXJQYXRocy5hZGQoZnMucmVhbHBhdGhTeW5jKGNhbmRpZGF0ZURpclBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIC5idW4gc3RvcmUgKGhvaXN0ZWQgaW5zdGFsbCk7IGZhbGwgdGhyb3VnaCB0byB0aGUgZXJyb3IgYmVsb3cuXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZURpclBhdGhzLnNpemUgPT09IDEpIHJldHVybiBbLi4uY2FuZGlkYXRlRGlyUGF0aHNdWzBdITtcbiAgaWYgKGNhbmRpZGF0ZURpclBhdGhzLnNpemUgPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE11bHRpcGxlIGluc3RhbGxlZCByZXNvbHV0aW9ucyBmb3VuZCBmb3IgJHtwYWNrYWdlTmFtZX06ICR7Wy4uLmNhbmRpZGF0ZURpclBhdGhzXS5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdEZWR1cGxpY2F0ZSB0aGUgZGVwZW5kZW5jeSBzbyBhIHNpbmdsZSByZXNvbHV0aW9uIHJlbWFpbnMuJ1xuICAgICk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJHtwYWNrYWdlTmFtZX0gKCR7ZGlyZWN0RGlyUGF0aH0pYCk7XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGxlZCBtYXRlcmlhbGl6YXRpb24gb2YgYSByZWdpc3RyeSBwYWNrYWdlLCB3aGVuIGl0cyB2ZXJzaW9uIGlzIHN0YXRpY2FsbHkga25vd24gdG9cbiAqIHNhdGlzZnkgdGhlIHNwZWNpZmllciDigJQgc3RlcHMgd2l0aG91dCByZWdpc3RyeSBjcmVkZW50aWFscyAoZS5nLiBDSSB0ZXN0IHN0ZXBzLCB3aGljaFxuICogZGVsaWJlcmF0ZWx5IHJlY2VpdmUgbm8gVmVyZGFjY2lvIHRva2VuKSByZXVzZSBpdCBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nLiBSZXR1cm5zIHVuZGVmaW5lZFxuICogKGZhbGxpbmcgYmFjayB0byBhIGRvd25sb2FkKSB3aGVuIG5vIHVuYW1iaWd1b3VzbHkgY29ycmVjdCBpbnN0YWxsZWQgY29weSBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRSZWdpc3RyeVBhY2thZ2UoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHByaXZhdGVQYWNrYWdlOiBQcml2YXRlUGFja2FnZVxuKTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3BlY2lmaWVyID0gcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JztcbiAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5qb2luKCdub2RlX21vZHVsZXMnLCAuLi5wcml2YXRlUGFja2FnZS5uYW1lLnNwbGl0KCcvJykpO1xuICBjb25zdCBhZGRDYW5kaWRhdGUgPSAoY2FuZGlkYXRlczogTWFwPHN0cmluZywgc3RyaW5nPiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlYWRJbnN0YWxsZWRWZXJzaW9uKGRpclBhdGgsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgIGlmICh2ZXJzaW9uICYmIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyLCB2ZXJzaW9uKSkgY2FuZGlkYXRlcy5zZXQoZnMucmVhbHBhdGhTeW5jKGRpclBhdGgpLCB2ZXJzaW9uKTtcbiAgfTtcbiAgLy8gQSByb290LWxldmVsIGluc3RhbGxhdGlvbiBpcyBUSEUgbG9ja2ZpbGUgcmVzb2x1dGlvbiBmb3IgdGhlIHJvb3QgZGVwZW5kZW5jeTsgdGhlIC5idW4gc3RvcmVcbiAgLy8gaXMgY29uc3VsdGVkIG9ubHkgZm9yIHRyYW5zaXRpdmUtb25seSBwYWNrYWdlcywgd2hlcmUgbXVsdGlwbGUgc2F0aXNmeWluZyByZXNvbHV0aW9ucyBtYXlcbiAgLy8gY29leGlzdCBhbmQgcGlja2luZyBvbmUgYXJiaXRyYXJpbHkgY291bGQgbWF0ZXJpYWxpemUgdGhlIHdyb25nIGNvbnRlbnQuXG4gIGNvbnN0IGRpcmVjdENhbmRpZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhZGRDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcywgcGF0aC5qb2luKHJvb3REaXJQYXRoLCByZWxhdGl2ZURpclBhdGgpKTtcbiAgaWYgKGRpcmVjdENhbmRpZGF0ZXMuc2l6ZSA9PT0gMSkgcmV0dXJuIHRvU2luZ2xlQ2FuZGlkYXRlKGRpcmVjdENhbmRpZGF0ZXMpO1xuXG4gIGNvbnN0IHN0b3JlQ2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5idW4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBhZGRDYW5kaWRhdGUoc3RvcmVDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicsIGRpcmVudC5uYW1lLCByZWxhdGl2ZURpclBhdGgpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIC5idW4gc3RvcmUgKGhvaXN0ZWQgaW5zdGFsbCk7IGZhbGwgYmFjayB0byBkb3dubG9hZGluZy5cbiAgfVxuICByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoc3RvcmVDYW5kaWRhdGVzKTtcbn1cblxuZnVuY3Rpb24gdG9TaW5nbGVDYW5kaWRhdGUoY2FuZGlkYXRlczogTWFwPHN0cmluZywgc3RyaW5nPik6IHsgZGlyUGF0aDogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFtlbnRyeV0gPSBjYW5kaWRhdGVzO1xuICByZXR1cm4gY2FuZGlkYXRlcy5zaXplID09PSAxICYmIGVudHJ5ID8geyBkaXJQYXRoOiBlbnRyeVswXSwgdmVyc2lvbjogZW50cnlbMV0gfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSBwYWNrYWdlTmFtZSAmJiB0eXBlb2YgcGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZydcbiAgICAgID8gcGFja2FnZUpzb24udmVyc2lvblxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFByaXZhdGVEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJpdmF0ZVBhY2thZ2VbXSB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBjb25zdCBpc0dpdCA9IGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpO1xuICAgICAgaWYgKCFpc0dpdCAmJiAhaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAoaXNHaXQgJiYgIW5hbWUuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBnaXQgZGVwZW5kZW5jeSBtdXN0IGJlIGFuIEB3aWxsYm9vc3RlciBwYWNrYWdlOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUobmFtZSk7XG4gICAgICAvLyBEZXBlbmRlbmN5IG5hbWVzIGJlY29tZSBleHRlcm5hbCBkYXRhIG9uY2UgbmVzdGVkIG1hbmlmZXN0cyBjb21lIGZyb20gZG93bmxvYWRlZFxuICAgICAgLy8gdGFyYmFsbHM7IHJlamVjdCBhbnl0aGluZyAocGF0aCBzZXBhcmF0b3JzLCBgLi5gLCBoaWRkZW4tZmlsZSBwcmVmaXhlcykgdGhhdCBjb3VsZFxuICAgICAgLy8gZXNjYXBlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRoZSBuYW1lIGlzIGpvaW5lZCBpbnRvIGJlZm9yZSBpdCBpcyByZWN1cnNpdmVseSBkZWxldGVkLlxuICAgICAgaWYgKCEvXltcXHcuLV0rJC8udGVzdCh1bnNjb3BlZE5hbWUpIHx8IHVuc2NvcGVkTmFtZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaXZhdGUgcGFja2FnZSBuYW1lOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBraW5kOiBpc0dpdCA/ICdnaXQnIDogJ3JlZ2lzdHJ5JyxcbiAgICAgICAgc291cmNlRGlyUGF0aDogdW5kZWZpbmVkLFxuICAgICAgICByZXNvbHZlZFZlcnNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgdGFyZ2V0RGlyUGF0aDogcGF0aC5qb2luKGlzR2l0ID8gb3V0RGlyUGF0aCA6IHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdW5zY29wZWROYW1lKSxcbiAgICAgICAgLy8gVGhlIGZ1bGwgZ2l0IHNwZWNpZmllciBpcyBwcmVzZXJ2ZWQgc28gZGl2ZXJnZW50IFVSTHMvcmV2aXNpb25zICgjYWJjIHZzICNkZWYpIGFyZVxuICAgICAgICAvLyBkZXRlY3RlZCBhcyBjb25mbGljdHMgaW5zdGVhZCBvZiBzaWxlbnRseSBjb2xsYXBzaW5nIGludG8gb25lIGNvcGllZCBwYWNrYWdlLlxuICAgICAgICB2ZXJzaW9uU3BlY2lmaWVyOiB2YWx1ZSBhcyBzdHJpbmcsXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2VzLnNldChuYW1lLCBleGlzdGluZyA/IG1lcmdlU2FtZU1hbmlmZXN0UmVxdWlyZW1lbnQoZXhpc3RpbmcsIHJlcXVlc3RlZCkgOiByZXF1ZXN0ZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV07XG59XG5cbi8qKlxuICogQSBtYW5pZmVzdCBtYXkgbGVnaXRpbWF0ZWx5IHJlcXVlc3Qgb25lIHBhY2thZ2UgZnJvbSBzZXZlcmFsIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYW4gZXhhY3RcbiAqIGRldkRlcGVuZGVuY2llcyBwaW4gYWxvbmdzaWRlIGEgcGVlckRlcGVuZGVuY2llcyByYW5nZSkuIEtlZXAgdGhlIE5BUlJPV0VSIHJlcXVpcmVtZW50IOKAlCBpdHNcbiAqIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gc2F0aXNmaWVzIHRoZSB3aWRlciBvbmUgYnkgZGVmaW5pdGlvbiAoYW4gZXhhY3QgcGluIGlzIHRoZSBuYXJyb3dlc3RcbiAqIHJhbmdlKSDigJQgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhlIHJlcXVpcmVtZW50cyBnZW51aW5lbHkgZGl2ZXJnZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UpOiBQcml2YXRlUGFja2FnZSB7XG4gIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gIGlmIChuYXJyb3dlcikgcmV0dXJuIG5hcnJvd2VyO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfSB3aXRoaW4gb25lIG1hbmlmZXN0OiBgICtcbiAgICAgIGAke2V4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPz8gZXhpc3Rpbmcua2luZH0gdnMgJHtyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyByZXF1ZXN0ZWQua2luZH0uYFxuICApO1xufVxuXG4vKipcbiAqIFRoZSByZXF1aXJlbWVudCB3aG9zZSBtYXgtc2F0aXNmeWluZyByZXNvbHV0aW9uIGlzIGd1YXJhbnRlZWQgdG8gc2F0aXNmeSB0aGUgb3RoZXIgKGFuIGV4YWN0XG4gKiBwaW4gaXMgdGhlIG5hcnJvd2VzdCByYW5nZSksIG9yIHVuZGVmaW5lZCB3aGVuIG5laXRoZXIgc3Vic3VtZXMgdGhlIG90aGVyLlxuICovXG5mdW5jdGlvbiBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChcbiAgZXhpc3Rpbmc6IFByaXZhdGVQYWNrYWdlLFxuICByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlXG4pOiBQcml2YXRlUGFja2FnZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChleGlzdGluZy5raW5kICE9PSByZXF1ZXN0ZWQua2luZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPT09IHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGlmIChzcGVjaWZpZXJTdWJzZXQoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciwgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGlmIChzcGVjaWZpZXJTdWJzZXQocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm4gcmVxdWVzdGVkO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgc3RhZ2luZ1Jvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+LFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgcHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpKSB7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHModG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIGlmICghcmVwbGFjZVBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uUGF0aCwgcGFja2FnZUpzb24sIHByaXZhdGVQYWNrYWdlcywgdG9TdGFnZWRQYXRoKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpfVxcbmAsICd1dGY4Jyk7XG4gICAgICAvLyBTdGFnaW5nIG1pcnJvcnMgdGhlIHJvb3QtcmVsYXRpdmUgbGF5b3V0LCBzbyB0aGlzIGlzIHRoZSBtYW5pZmVzdCdzIHBvc3Qtc3dhcCBsb2NhdGlvbi5cbiAgICAgIGNvbnNvbGUuaW5mbyhgUmV3cm90ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBpbiAke3BhdGgucmVsYXRpdmUoc3RhZ2luZ1Jvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+LFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgaWYgKCFpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSAmJiAhaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkgY29udGludWU7XG4gICAgICBjb25zdCB0YXJnZXRQYWNrYWdlID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuYW1lKTtcbiAgICAgIGlmICghdGFyZ2V0UGFja2FnZSkgY29udGludWU7XG5cbiAgICAgIC8vIEJvdGggc2lkZXMgYXJlIHN0YWdlZCBwYXRoczogc3RhZ2luZyBtaXJyb3JzIHRoZSByb290LXJlbGF0aXZlIGxheW91dCwgc28gdGhlIHJlbGF0aXZlXG4gICAgICAvLyBzcGVjaWZpZXIgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdGhlIGZpbmFsIGxvY2F0aW9ucyB3b3VsZCBwcm9kdWNlLlxuICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID1cbiAgICAgICAgYGZpbGU6JHtwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCB0b1N0YWdlZFBhdGgodGFyZ2V0UGFja2FnZS50YXJnZXREaXJQYXRoKSl9YDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlZDtcbn1cblxuLyoqXG4gKiBNb3ZlIGV2ZXJ5IHN0YWdlZCB0cmVlIG9udG8gaXRzIGZpbmFsIGxvY2F0aW9uIGFzIG9uZSB0cmFuc2FjdGlvbjogZWFjaCBsaXZlIHRyZWUgaXMgc2V0IGFzaWRlXG4gKiBmaXJzdCBzbyBhIGZhaWxpbmcgcmVuYW1lIGNhbiByZXN0b3JlIHRoZSBwcmV2aW91cyBzdGF0ZSBpbnN0ZWFkIG9mIGxlYXZpbmcgb25lIHRyZWUgcmVwbGFjZWRcbiAqIGFuZCB0aGUgb3RoZXIgc3RhbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzd2FwTWF0ZXJpYWxpemVkVHJlZXMoXG4gIG91dERpclBhdGhzOiBzdHJpbmdbXSxcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmcsXG4gIGJhY2t1cFJvb3REaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIFVOSVFVRSBkaXJlY3RvcnkgcGVyIGludm9jYXRpb246IHdoZW4gYSByb2xsYmFjayBmYWlscyBpdHMgYmFja3VwIGlzIHJldGFpbmVkIGZvciBtYW51YWxcbiAgLy8gcmVjb3ZlcnksIGFuZCBhIGZpeGVkIHBhdGggd291bGQgbGV0IHRoZSBuZXh0IHJ1biBkZWxldGUgdGhlIG9ubHkgcmVtYWluaW5nIGNvcHkuXG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShiYWNrdXBSb290RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBiYWNrdXBEaXJSb290ID0gYXdhaXQgZnMucHJvbWlzZXMubWtkdGVtcChgJHtiYWNrdXBSb290RGlyUGF0aH0tYCk7XG4gIC8vIFJlY29yZGVkIEJFRk9SRSB0aGUgc3RhZ2VkIHRyZWUgaXMgcmVuYW1lZCBpbjogYmV0d2VlbiBzZXR0aW5nIHRoZSBsaXZlIHRyZWUgYXNpZGUgYW5kXG4gIC8vIGluc3RhbGxpbmcgaXRzIHJlcGxhY2VtZW50IHRoZSBwcmV2aW91cyBtYXRlcmlhbGl6YXRpb24gZXhpc3RzIG9ubHkgaW4gdGhlIGJhY2t1cCwgYW5kIGEgcmVjb3JkXG4gIC8vIGFkZGVkIGFmdGVyIHRoZSByZW5hbWUgd291bGQgbGVhdmUgdGhhdCB3aW5kb3cgdW5yZWNvdmVyYWJsZS5cbiAgY29uc3Qgc3dhcHBlZERpcnM6IHsgb3V0RGlyUGF0aDogc3RyaW5nOyBiYWNrdXBEaXJQYXRoOiBzdHJpbmc7IGhhZFByZXZpb3VzVHJlZTogYm9vbGVhbiB9W10gPSBbXTtcbiAgbGV0IHJlc3RvcmVGYWlsZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3V0RGlyUGF0aF0gb2Ygb3V0RGlyUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAvLyBJbmRleGVkIChub3QgbmFtZWQgYWZ0ZXIgdGhlIGRpcmVjdG9yeSkgc28gdHdvIG91dHB1dCB0cmVlcyBzaGFyaW5nIGEgYmFzZW5hbWUgY2Fubm90XG4gICAgICAvLyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIGJhY2t1cC5cbiAgICAgIGNvbnN0IGJhY2t1cERpclBhdGggPSBwYXRoLmpvaW4oYmFja3VwRGlyUm9vdCwgU3RyaW5nKGluZGV4KSk7XG4gICAgICBjb25zdCBoYWRQcmV2aW91c1RyZWUgPSBmcy5leGlzdHNTeW5jKG91dERpclBhdGgpO1xuICAgICAgaWYgKGhhZFByZXZpb3VzVHJlZSkgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG91dERpclBhdGgsIGJhY2t1cERpclBhdGgpO1xuICAgICAgc3dhcHBlZERpcnMucHVzaCh7IG91dERpclBhdGgsIGJhY2t1cERpclBhdGgsIGhhZFByZXZpb3VzVHJlZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShvdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodG9TdGFnZWRQYXRoKG91dERpclBhdGgpLCBvdXREaXJQYXRoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gUmV2ZXJzZSBvcmRlcjogdW5kbyB0aGUgbW9zdCByZWNlbnQgc3dhcCBmaXJzdC5cbiAgICBmb3IgKGNvbnN0IHN3YXBwZWQgb2Ygc3dhcHBlZERpcnMudG9SZXZlcnNlZCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShzd2FwcGVkLm91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKHN3YXBwZWQuaGFkUHJldmlvdXNUcmVlKSBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUoc3dhcHBlZC5iYWNrdXBEaXJQYXRoLCBzd2FwcGVkLm91dERpclBhdGgpO1xuICAgICAgfSBjYXRjaCAocm9sbGJhY2tFcnJvcikge1xuICAgICAgICAvLyBSZXBvcnRpbmcgdGhlIG9yaWdpbmFsIGZhaWx1cmUgbWF0dGVycyBtb3JlLCBidXQgYSBmYWlsZWQgcm9sbGJhY2sgbGVhdmVzIHRoZSB0cmVlXG4gICAgICAgIC8vIG1pc3NpbmcsIHNvIGl0IG11c3Qgbm90IHBhc3Mgc2lsZW50bHkg4oCUIGFuZCBpdHMgYmFja3VwIGlzIHRoZW4gdGhlIE9OTFkgcmVtYWluaW5nIGNvcHkuXG4gICAgICAgIHJlc3RvcmVGYWlsZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVzdG9yZSAke3N3YXBwZWQub3V0RGlyUGF0aH06ICR7U3RyaW5nKHJvbGxiYWNrRXJyb3IpfVxcbmAgK1xuICAgICAgICAgICAgICBgVGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbiBpcyBrZXB0IGF0ICR7c3dhcHBlZC5iYWNrdXBEaXJQYXRofTsgbW92ZSBpdCBiYWNrIGJ5IGhhbmQuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT25seSB3aGVuIG5vdGhpbmcgaXMgbGVmdCB0byByZWNvdmVyOiBkZWxldGluZyB0aGUgYmFja3VwcyBhZnRlciBhIGZhaWxlZCByZXN0b3JlIHdvdWxkXG4gICAgLy8gZGVzdHJveSB0aGUgbGFzdCBjb3B5IG9mIHRoZSBwcmV2aW91cyBtYXRlcmlhbGl6YXRpb24uIEFuZCBieSB0aGlzIHBvaW50IGJvdGggdHJlZXMgYXJlXG4gICAgLy8gYWxyZWFkeSBjb21taXR0ZWQsIHNvIGEgY2xlYW51cCBmYWlsdXJlIChlLmcuIGEgcmVhZC1vbmx5IGRpcmVjdG9yeSBgZnMuY3BgIHByZXNlcnZlZCkgbXVzdFxuICAgIC8vIG5vdCB0dXJuIGEgc3VjY2Vzc2Z1bCBtYXRlcmlhbGl6YXRpb24gaW50byBhIHJlcG9ydGVkIGZhaWx1cmUuXG4gICAgaWYgKCFyZXN0b3JlRmFpbGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShiYWNrdXBEaXJSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgRmFpbGVkIHRvIHJlbW92ZSAke2JhY2t1cERpclJvb3R9OiAke1N0cmluZyhjbGVhbnVwRXJyb3IpfWApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHJldHVybiBbXTtcblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmIChkaXJlbnQubmFtZSA9PT0gJ25vZGVfbW9kdWxlcycgfHwgZGlyZW50Lm5hbWUgPT09ICcuZ2l0JykgY29udGludWU7XG5cbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKC4uLihhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhjaGlsZFBhdGgpKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZSA9PT0gJ3BhY2thZ2UuanNvbicpIHtcbiAgICAgIHBhY2thZ2VKc29uUGF0aHMucHVzaChjaGlsZFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogUHJvbWlzZTxQYWNrYWdlSnNvbj4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xufVxuXG5mdW5jdGlvbiBwcmludERyeVJ1blJlc3VsdChvdXREaXJQYXRoOiBzdHJpbmcsIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIHJlY3JlYXRlICR7b3V0RGlyUGF0aH1gKTtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoXG4gICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06ICR7cHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aH1gXG4gICAgICAgIDogcHJpdmF0ZVBhY2thZ2Uua2luZCA9PT0gJ2dpdCdcbiAgICAgICAgICA/IGBbZHJ5LXJ1bl0gV291bGQgY29weSAke3ByaXZhdGVQYWNrYWdlLm5hbWV9OiAoaW5zdGFsbGVkIHVuZGVyIG5vZGVfbW9kdWxlcylgXG4gICAgICAgICAgOiBgW2RyeS1ydW5dIFdvdWxkIGRvd25sb2FkICR7cHJpdmF0ZVBhY2thZ2UubmFtZX1AJHtwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyfSB0byAke3ByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGh9YFxuICAgICk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmV3cml0ZSBjb3BpZWQgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgdG8gZmlsZTouLi88bmFtZT5gKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHtcbiAgZmluZERlc2NlbmRhbnRQcm9qZWN0cyxcbiAgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLFxuICBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoLFxuICB0eXBlIFByb2plY3QsXG59IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNEb2NrZXJFbmFibGVkIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5pbXBvcnQge1xuICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICBpc1ByaXZhdGVHaXREZXBlbmRlbmN5LFxuICBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3ksXG4gIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMsXG4gIHRvVW5zY29wZWRQYWNrYWdlTmFtZSxcbn0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuaW1wb3J0IHsgY29sbGVjdE1hbmlmZXN0cywgbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IHNxbGl0ZUZpbGVQYXR0ZXJuID0gL1xcLig/OnNxbGl0ZTM/fGRiKSg/OlstLl0oPzpqb3VybmFsfHNobXx3YWwpKT8kL2k7XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0aHMgPSBbXG4gICcuY2FjaGUnLFxuICAnLm15cHlfY2FjaGUnLFxuICAnLm5leHQvY2FjaGUnLFxuICAnLnBhcmNlbC1jYWNoZScsXG4gICcucHl0ZXN0X2NhY2hlJyxcbiAgJy5ydWZmX2NhY2hlJyxcbiAgJy50b3gnLFxuICAnLnR1cmJvJyxcbiAgJy52ZW52JyxcbiAgJy55YXJuL2NhY2hlJyxcbiAgJy55YXJuL2luc3RhbGwtc3RhdGUuZ3onLFxuICAnX19weWNhY2hlX18nLFxuICAnY292ZXJhZ2UnLFxuICAnbm9kZV9tb2R1bGVzLy5jYWNoZScsXG4gICdwbGF5d3JpZ2h0LXJlcG9ydCcsXG4gICdzdG9yeWJvb2stc3RhdGljJyxcbiAgJ3RhcmdldCcsXG4gICd0ZXN0LXJlc3VsdHMnLFxuXTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyA9IFsnKiovKi5weWMnLCAnKiovKi50c2J1aWxkaW5mbycsICcqKi9fX3B5Y2FjaGVfXyddO1xuY29uc3QgZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMgPSBbJ3ByaXNtYScsICdkYicsICdkcml6emxlJ10gYXMgY29uc3Q7XG5jb25zdCBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMgPSBbJy9kYXRhJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gTWF0ZXJpYWxpemUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgb24gdGhlIGhvc3QgZmlyc3Qgc28gdGhlIHBlci1wcm9qZWN0IHJld3JpdGUgYmVsb3cgcmVzb2x2ZXNcbiAgICAvLyB0aGVtIHRvIGZpbGU6IHBhdGhzIGFuZCB0aGUgRG9ja2VyIGJ1aWxkIG5lZWRzIG5vIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLiBPbmx5IGluIC0tb3V0c2lkZVxuICAgIC8vIG1vZGUgKHRoZSBpbi1pbWFnZSBzZWNvbmQgcGFzcyBoYXMgbm8gbm9kZV9tb2R1bGVzL3JlZ2lzdHJ5IHRvIG1hdGVyaWFsaXplIGZyb20pIGFuZCBvbmx5XG4gICAgLy8gd2hlbiBhIHByaXZhdGUgZGVwZW5kZW5jeSBpcyBhY3R1YWxseSBkZWNsYXJlZCwgc28gcmVwb3Mgd2l0aG91dCBvbmUgYXJlIHVudG91Y2hlZCDigJQgbm8gZW1wdHlcbiAgICAvLyBvdXRwdXQgZGlyZWN0b3JpZXMsIG5vIHNwdXJpb3VzIFwiQ09QWVwiIGhpbnQuIEZhaWx1cmVzIGFyZSBub24tZmF0YWwgYW5kIG5vbi1kZXN0cnVjdGl2ZTpcbiAgICAvLyBtYXRlcmlhbGl6ZSB0aHJvd3MgYmVmb3JlIGRlbGV0aW5nIGFueSBleGlzdGluZyBvdXRwdXQgKGFuZCBjbGVhbnMgdXAgaXRzIHN0YWdpbmcgb24gYSBmYWlsZWRcbiAgICAvLyBkb3dubG9hZCksIHNvIGEgcmVwbyBsYWNraW5nIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIGtlZXBzIGJ1aWxkaW5nIGV4YWN0bHkgYXMgYmVmb3JlLCB3aXRoIHRoZVxuICAgIC8vIHBlci1wcm9qZWN0IHJld3JpdGUgYmVsb3cgZW1pdHRpbmcgdGhlIGV4aXN0aW5nIFwicnVuIHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcIiBoaW50LiBUaGlzXG4gICAgLy8ga2VlcHMgdGhlIHN0ZXAgYSBwdXJlIGNvbnZlbmllbmNlIHRoYXQgbGV0cyByZXBvc2l0b3JpZXMgZHJvcCB0aGUgZXhwbGljaXQgY29tbWFuZC5cbiAgICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHdvcmtzcGFjZSBzZXQgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290IHNvIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGRlY2xhcmVkIGluXG4gICAgICAvLyBhbnkgc2libGluZyB3b3Jrc3BhY2UgaXMgbWF0ZXJpYWxpemVkIGV2ZW4gd2hlbiBvcHRpbWl6ZSBydW5zIGZyb20gYSBzdWJwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICAgIGNvbnN0IHJvb3RQcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RzLnJvb3QuZGlyUGF0aCk7XG4gICAgICBjb25zdCBtYW5pZmVzdHMgPSBjb2xsZWN0TWFuaWZlc3RzKHJvb3RQcm9qZWN0cyA/PyBwcm9qZWN0cyk7XG4gICAgICBpZiAobWFuaWZlc3RzLnNvbWUoZGVjbGFyZXNQcml2YXRlRGVwZW5kZW5jeSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhwcm9qZWN0cy5yb290LmRpclBhdGgsIG1hbmlmZXN0cywgeyBkcnlSdW46IEJvb2xlYW4oYXJndi5kcnlSdW4pIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBhdXRvLW1hdGVyaWFsaXplIHByaXZhdGUgcGFja2FnZXMgKCR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfSk7IGAgK1xuICAgICAgICAgICAgICAgICdydW4gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIGlmIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgdGhlbS4gQ29udGludWluZy4nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvamVjdHMucm9vdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqIFdoZXRoZXIgYW55IGRlcGVuZGVuY3kgc2VjdGlvbiBkZWNsYXJlcyBhIHByaXZhdGUgZ2l0IG9yIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSBkZXBlbmRlbmN5LiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNQcml2YXRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5cy5zb21lKChrZXkpID0+IHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICByZXR1cm4gKFxuICAgICAgZGVwcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBPYmplY3QuZW50cmllcyhkZXBzKS5zb21lKFxuICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT4gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkgfHwgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uKTtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXdyaXR0ZW5EZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgaWYgKGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpKSB7XG4gICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAvLyBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhvc2Ugd29ya3NwYWNlIHBhY2thZ2VzIGludG8gdGhlIGltYWdlIGluc3RlYWQuIE9ubHkgdGhlIG9yZydzXG4gICAgICAgIC8vIG93biBnaXQgZGVwZW5kZW5jaWVzIGFyZSByZXdyaXR0ZW4g4oCUIHRoZSBzaGFyZWQgcHJlZGljYXRlIG1hdGNoZXMgZXhhY3RseSB3aGF0XG4gICAgICAgIC8vIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZXMsIHNvIG90aGVyIFNTSCBVUkxzIGFyZSBsZWZ0IHVuY2hhbmdlZCBpbnN0ZWFkXG4gICAgICAgIC8vIG9mIGJlaW5nIHBvaW50ZWQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIGxvY2FsIHBhdGhzLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCAnQHdpbGxib29zdGVyJywgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfSBlbHNlIGlmIChpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IG1hdGVyaWFsaXplZFZlcnNpb24gPSByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGgsIG5hbWUpO1xuICAgICAgICBpZiAobWF0ZXJpYWxpemVkVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTGVhdmluZyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIG1lYW5zIHRoZSBpbi1pbWFnZSBpbnN0YWxsIG5lZWRzIFZlcmRhY2Npb1xuICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIOKAlCB0aGUgZmFpbHVyZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIGF2b2lkIOKAlCBzbyBzYXkgc28gb3V0IGxvdWQuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgJHtuYW1lfSBpcyBub3QgbWF0ZXJpYWxpemVkIHVuZGVyICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vOyBydW4gXFxgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1xcYCBzbyB0aGUgRG9ja2VyIGJ1aWxkIGRvZXMgbm90IG5lZWQgcmVnaXN0cnkgY3JlZGVudGlhbHMuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIHN0YWxlIHdoZW4gdGhlIHNwZWNpZmllciAoYW4gZXhhY3QgdmVyc2lvbiBvciBhbnkgc2VtdmVyXG4gICAgICAgIC8vIHJhbmdlIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0IHRoZSByZWdpc3RyeSkgZG9lc1xuICAgICAgICAvLyBub3QgYWRtaXQgaXQuIERpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYDIwMjYtc3RhYmxlYCkgc2tpcCB0aGUgc3RhbGVuZXNzIGNoZWNrLlxuICAgICAgICBpZiAoIW1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXModmFsdWUsIG1hdGVyaWFsaXplZFZlcnNpb24pKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICAgYE1hdGVyaWFsaXplZCAke25hbWV9IGlzICR7bWF0ZXJpYWxpemVkVmVyc2lvbn0gYnV0IHBhY2thZ2UuanNvbiByZXF1aXJlcyAke3ZhbHVlfTsgcmVydW4gXFxgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1xcYC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVnaXN0cnkgcGFja2FnZXMgdGhhdCBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVkIG9uIHRoZSBob3N0IGFyZSB1c2VkIGFzXG4gICAgICAgIC8vIGxvY2FsIHBhdGhzIHNvIGltYWdlIGJ1aWxkcyBuZWVkIG5vIFZlcmRhY2NpbyBjcmVkZW50aWFsczsgdGhlIENPTU1JVFRFRCBwYWNrYWdlLmpzb25cbiAgICAgICAgLy8ga2VlcHMgdGhlIHJlZ2lzdHJ5IHNwZWNpZmllciDigJQgb25seSB0aGUgZ2VuZXJhdGVkIChkaXN0LylwYWNrYWdlLmpzb24gaXMgcmV3cml0dGVuXG4gICAgICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NjQpLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmV3cm90ZSBwcml2YXRlIGRlcGVuZGVuY2llczonLCByZXdyaXR0ZW5EZXBlbmRlbmNpZXMuam9pbignLCAnKSB8fCAnbm9uZScpO1xuICByZXR1cm4gcmV3cml0dGVuRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgc2NvcGVEaXJOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgc2NvcGVEaXJOYW1lLCB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG4vKiogVW5kZWZpbmVkIHdoZW4gdGhlIHBhY2thZ2UgaXMgbm90IG1hdGVyaWFsaXplZCAob3IgaXRzIG1hbmlmZXN0IGlzIHVucmVhZGFibGUvdmVyc2lvbmxlc3MpLiAqL1xuZnVuY3Rpb24gcmVhZE1hdGVyaWFsaXplZFBhY2thZ2VWZXJzaW9uKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oXG4gICAgcm9vdERpclBhdGgsXG4gICAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgICB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpLFxuICAgICdwYWNrYWdlLmpzb24nXG4gICk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uKS52ZXJzaW9uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlRG9ja2VyU2hlbGxTY3JpcHRzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzb3VyY2VEaXJQYXRoID0gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkgfHwgIWRpcmVudC5uYW1lLmVuZHNXaXRoKCcuc2gnKSkgY29udGludWU7XG5cbiAgICBjb25zdCB0YXJnZXRGaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY29weUZpbGUocGF0aC5qb2luKHNvdXJjZURpclBhdGgsIGRpcmVudC5uYW1lKSwgdGFyZ2V0RmlsZVBhdGgpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNobW9kKHRhcmdldEZpbGVQYXRoLCAwbzc1NSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgRG9ja2VyIHNoZWxsIHNjcmlwdHM6ICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBkaXJQYXRoKSB8fCBkaXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpOiBzdHJpbmcge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ2RvY2tlcicsICdiYXNoJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2NrZXIgc2hlbGwgc2NyaXB0cyBkaXJlY3Rvcnkgbm90IGZvdW5kLicpO1xuICAgIH1cbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBkZXBlbmRlbmNpZXMgYW5kIHJlbW92ZSBvbmx5IGtub3duIG5vbi1idWlsZCB0b29saW5nLlxuICAgIHJldHVybiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbik7XG4gIH1cblxuICAvLyBJbnNpZGUgRG9ja2VyLCBjb2RlZ2VuL2J1aWxkIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCBzbyBwcm9kdWN0aW9uIGluc3RhbGwgc2hvdWxkIG5vdCBzZWUgZGV2IHRvb2xpbmcuXG4gIGNvbnN0IHJlbW92ZWREZXBlbmRlbmNpZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge30pO1xuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgcmV0dXJuIHJlbW92ZWREZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgLy8gSW4gLS1vdXRzaWRlIG1vZGUsIERvY2tlciBzdGlsbCBydW5zIGNvZGVnZW4vYnVpbGQgYmVmb3JlIGEgc2Vjb25kIGluLWltYWdlIG9wdGltaXphdGlvbi5cbiAgLy8gUmVtb3ZlIG9ubHkgdG9vbGluZyB0aGF0IGlzIG5vdCBuZWVkZWQgZm9yIHRoYXQgYnVpbGQgcGhhc2UuXG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdiaW9tZScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ294Zm10JyxcbiAgICAnb3hsaW50JyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU2hhcmVkIGNvbmZpZyBwYWNrYWdlcyBhcmUgbmVlZGVkIG9ubHkgZm9yIGxpbnQvZm9ybWF0L3Rlc3QgY29tbWFuZHMsIG5vdCBEb2NrZXIgYnVpbGRzLlxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xuICByZXR1cm4gcmVtb3ZlZERlcHM7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIG9wdGlvbnM6IHsgcmVtb3ZlV2JQb3N0aW5zdGFsbDogYm9vbGVhbiB9KTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnJlbW92ZVdiUG9zdGluc3RhbGwgJiYgbmFtZSA9PT0gJ3Bvc3RpbnN0YWxsJyAmJiBjb250ZW50LnRyaW0oKSA9PT0gJ3diIGdlbi1jb2RlJykgfHxcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKHByb2plY3RzOiBQcm9qZWN0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgYXdhaXQgcmVtb3ZlUHJvamVjdENhY2hlcyhwcm9qZWN0KTtcbiAgICBhd2FpdCByZW1vdmVHZW5lcmF0ZWRMb2NhbERhdGEocHJvamVjdCk7XG4gICAgcnVuRG9ja2VyQ2xlYW51cFNjcmlwdChwcm9qZWN0KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IFtcbiAgICAuLi4oYXdhaXQgcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3QpKSxcbiAgICAuLi4oYXdhaXQgcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zKHByb2plY3QpKSxcbiAgXTtcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIERvY2tlciBidWlsZCBjYWNoZXM6JywgcmVsYXRpdmVQYXRocy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIGRvY2tlckJ1aWxkQ2FjaGVQYXRocykge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRQYXRoKSkgY29udGludWU7XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmVtb3ZlZFBhdGhzLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGF3YWl0IGdsb2JieShkb2NrZXJCdWlsZENhY2hlUGF0dGVybnMsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcycsICcqKi9ub2RlX21vZHVsZXMvKionLCAnKiovLnlhcm4nLCAnKiovLnlhcm4vKionLCAnKiovLmdpdCcsICcqKi8uZ2l0LyoqJ10sXG4gICAgb25seUZpbGVzOiBmYWxzZSxcbiAgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlbGF0aXZlUGF0aHMubWFwKChyZWxhdGl2ZVBhdGgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICApXG4gICk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRMb2NhbERhdGEocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1vdmVkUGF0aEdyb3VwcyA9IGF3YWl0IFByb21pc2UuYWxsKFtyZW1vdmVHZW5lcmF0ZWRNb3VudERpcnMocHJvamVjdCksIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3QpXSk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IHJlbW92ZWRQYXRoR3JvdXBzLmZsYXQoKTtcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGdlbmVyYXRlZCBsb2NhbCBkYXRhOicsIHJlbW92ZWRQYXRocy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiByZWxhdGl2ZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZE1vdW50RGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVmYXVsdFBhdGhzID0gZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMubWFwKChkaXJOYW1lKSA9PiBwYXRoLmpvaW4oZGlyTmFtZSwgJ21vdW50JykpO1xuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIGNvbnN0IGFic29sdXRlRGlyUGF0aCA9IHBhdGguZGlybmFtZShkYlBhdGgpO1xuICBpZiAocGF0aC5iYXNlbmFtZShhYnNvbHV0ZURpclBhdGgpICE9PSAnbW91bnQnIHx8ICFpc1BhdGhJbnNpZGVQcm9qZWN0KHByb2plY3QsIGFic29sdXRlRGlyUGF0aCkpIHtcbiAgICByZXR1cm4gZGVmYXVsdFBhdGhzO1xuICB9XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBhYnNvbHV0ZURpclBhdGgpO1xuICBpZiAoIXJlbGF0aXZlUGF0aCkgcmV0dXJuIGRlZmF1bHRQYXRocztcblxuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRlZmF1bHRQYXRocywgcmVsYXRpdmVQYXRoXSldO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3QpLFxuICAgIHJlbW92ZUVudkdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3QpLFxuICBdKTtcbiAgcmV0dXJuIHJlbW92ZWRQYXRocy5mbGF0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EZWZhdWx0RGlycyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJQYXRocyA9IGF3YWl0IGdldEdlbmVyYXRlZFNxbGl0ZURpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSBhd2FpdCBQcm9taXNlLmFsbChkaXJQYXRocy5tYXAoKGRpclBhdGgpID0+IHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EaXIocHJvamVjdCwgZGlyUGF0aCkpKTtcbiAgcmV0dXJuIHJlbW92ZWRQYXRocy5mbGF0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEdlbmVyYXRlZFNxbGl0ZURpclBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMubWFwKChkaXJOYW1lKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBkaXJOYW1lKSk7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChkaXJQYXRocy5tYXAoKGRpclBhdGgpID0+IGlzRGlyZWN0b3J5KGRpclBhdGgpKSk7XG4gIHJldHVybiBkaXJQYXRocy5maWx0ZXIoKF8sIGluZGV4KSA9PiByZXN1bHRzW2luZGV4XSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVudkdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRiRmlsZVBhdGhzID0gZ2V0RW52R2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGJGaWxlUGF0aCBvZiBkYkZpbGVQYXRocykge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0UGF0aCBvZiBnZXRTcWxpdGVGaWxlRmFtaWx5UGF0aHMoZGJGaWxlUGF0aCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGlzRmlsZSh0YXJnZXRQYXRoKSkpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgcmVtb3ZlZFBhdGhzLnB1c2gocGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHRhcmdldFBhdGgpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0RW52R2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlRGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCB8fCAhYWJzb2x1dGVEYlBhdGgpIHJldHVybiBbXTtcblxuICBjb25zdCBmaWxlUGF0aHMgPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKVxuICAgID8gW2RiUGF0aF1cbiAgICA6IFthYnNvbHV0ZURiUGF0aCwgLi4uZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMubWFwKChkaXJOYW1lKSA9PiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkaXJOYW1lLCBkYlBhdGgpKV07XG4gIHJldHVybiBbLi4ubmV3IFNldChmaWxlUGF0aHMpXS5maWx0ZXIoKGZpbGVQYXRoKSA9PiBpc0dlbmVyYXRlZFNxbGl0ZUZpbGVQYXRoU2FmZShwcm9qZWN0LCBmaWxlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFNxbGl0ZUZpbGVQYXRoU2FmZShwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1BhdGhJbnNpZGVQcm9qZWN0KHByb2plY3QsIGZpbGVQYXRoKSB8fCBpc0RvY2tlckdlbmVyYXRlZERhdGFGaWxlUGF0aChwcm9qZWN0LCBmaWxlUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG9ja2VyR2VuZXJhdGVkRGF0YURpclBhdGhzLnNvbWUoKGRpclBhdGgpID0+IHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnJyAmJiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgZGJGaWxlUGF0aCxcbiAgICBgJHtkYkZpbGVQYXRofS1qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS1zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LXdhbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0uam91cm5hbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0uc2htYCxcbiAgICBgJHtkYkZpbGVQYXRofS53YWxgLFxuICBdO1xufVxuXG5mdW5jdGlvbiBpc1BhdGhJbnNpZGVQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIHRhcmdldFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCk7XG4gIC8vIGBzdGFydHNXaXRoKCcuLicpYCB3b3VsZCByZWplY3QgcHJvamVjdC1sb2NhbCBuYW1lcyBzdWNoIGFzIGAuLmNhY2hlYC5cbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCA9PT0gJycgfHwgKHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoYC4uJHtwYXRoLnNlcH1gKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgIHJldHVybiBzdGF0LmlzRmlsZSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNEaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZGlyUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNEaXJlY3RvcnkoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EaXIocHJvamVjdDogUHJvamVjdCwgZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IHNxbGl0ZUZpbGVOYW1lcyA9IGRpcmVudHNcbiAgICAuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBzcWxpdGVGaWxlUGF0dGVybi50ZXN0KGRpcmVudC5uYW1lKSlcbiAgICAubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoc3FsaXRlRmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSksIHsgZm9yY2U6IHRydWUgfSkpKTtcblxuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgZGlyUGF0aCk7XG4gIHJldHVybiBzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5qb2luKHJlbGF0aXZlRGlyUGF0aCwgZmlsZU5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcnVuRG9ja2VyQ2xlYW51cFNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGlmICghaXNEb2NrZXJFbmFibGVkKHByb2plY3QpKSByZXR1cm47XG5cbiAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdiYXNoJywgJ2NsZWFudXAuc2gnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNjcmlwdFBhdGgpKSByZXR1cm47XG5cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2Jhc2gnLCBbc2NyaXB0UGF0aCwgJy0ta2VlcC1zY3JpcHRzJ10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJHtwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgc2NyaXB0UGF0aCl9YCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNEb2NrZXJFbmFibGVkIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy9ldGMvbGl0ZXN0cmVhbS55bWwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcjogY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgaWYgKGFsbFByb2plY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NyZWF0aW5nIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgcHJvamVjdHMgYXQgb25jZSBpcyBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhleSB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4nXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0LCBvcm0sIGFyZ3Yub3V0cHV0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95Rm9yY2UocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGdlbmVyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdnZW5lcmF0ZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgT1JNIGNsaWVudCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGdlbmVyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZ2VuZXJhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgY29uZmlnOiB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGxpdGVzdHJlYW1Db25maWdCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXN0LWJhY2t1cHMnLFxuICBkZXNjcmliZTogJ0xpc3QgTGl0ZXN0cmVhbSBiYWNrdXBzJyxcbiAgYnVpbGRlcjogbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBsaXN0LWJhY2t1cHMnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5saXN0QmFja3Vwcyhwcm9qZWN0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnY2hlY2staWRlbXBvdGVuY3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIG1pZ3JhdGlvbiBjb21tYW5kIHR3aWNlIHRvIGNvbmZpcm0gaXQgaXMgaWRlbXBvdGVudC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIG1pZ3JhdGVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyOiBtaWdyYXRlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2NoZWNrLWlkZW1wb3RlbmN5J10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3JtU2NyaXB0cyA9IGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAncHJvZHVjdGlvbicpO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gRm9yY2UgdG8gcmVzZXQgdGVzdCBkYXRhYmFzZVxuICAgIGlmIChwcm9jZXNzLmVudi5XQl9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WID0gJ3Rlc3QnO1xuICAgICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICAgICAgICAnV0JfRU5WPXRlc3QgZGIgcmVzZXQnLFxuICAgICAgICBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KVxuICAgICAgKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8ZHJpenpsZXxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGFyZ3Yub3V0cHV0ID8/IGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3QsIG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gZGF0YWJhc2Ugc3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgLy8gUmVzb2x2ZWQgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYmVjYXVzZSBwcmlzbWFTY3JpcHRzLnN0dWRpbyByZXNvbHZlcyBhIHJlbGF0aXZlXG4gICAgICAvLyBwYXRoIGFnYWluc3QgdGhlIENMSSBwcm9jZXNzIGRpcmVjdG9yeSwgd2hpY2ggZGlmZmVycyBmb3Igd29ya3NwYWNlIGRlc2NlbmRhbnRzLlxuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wcmlzbWFEaXJOYW1lLCAncmVzdG9yZWQuc3FsaXRlMycpXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTpcbiAgICBcIlBhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byB0aGUgZGV0ZWN0ZWQgT1JNIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChgZGIgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBvcm0gPT09ICdwcmlzbWEnID8gYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAgOiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGZ1bGxDb21tYW5kKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgY29tbWFuZCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogTWFrZSBEcml6emxlIGNvbW1hbmRzIHdvcmsgb24gQ2xvdWRmbGFyZSBEMSBwcm9qZWN0cyBieSBwb2ludGluZyBEQVRBQkFTRV9VUkxcbiAqIGF0IHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtOiBEYXRhYmFzZU9ybSwgcHJvamVjdDogUHJvamVjdCwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3JtID09PSAnZHJpenpsZScgPyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBzY3JpcHQpIDogc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0sIGNvbmZpZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3QsIG9ybSk7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYHNuYXBzaG90OlxuICBpbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gIHJldGVudGlvbjogNzJoICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbmRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCwge1xuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykgcmV0dXJuIGAke3Byb2plY3QucHJpc21hRGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlM2A7XG4gIHJldHVybiAnZHJpenpsZS9yZXN0b3JlZC5zcWxpdGUzJztcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtKTogc3RyaW5nIHtcbiAgaWYgKG9ybSA9PT0gJ3ByaXNtYScpIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnIGZvciBEcml6emxlIHJlcXVpcmVzIGZpbGU6IERBVEFCQVNFX1VSTC4nKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNlbGVjdEZub3hTb3VyY2VkS2V5cyB9IGZyb20gJy4uL3V0aWxzL2VudlNvdXJjZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuLy8gUmFpbHdheSBpbmplY3RzIGl0cyBvd24gc3lzdGVtIHZhcmlhYmxlcyBhbmQgcGxhdGZvcm0tbWFuYWdlZCB2YWx1ZXM7IG5ldmVyIG1pcnJvciB0aG9zZSBiYWNrLFxuLy8gYW5kIHNraXAgbG9jYWwtb25seSBrZXlzLiBBcHAgdmFyaWFibGVzIChpbmNsdWRpbmcgREFUQUJBU0VfVVJMLCBQT1JUKSBzdGF5IGVsaWdpYmxlIGJlY2F1c2Vcbi8vIGZub3ggaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCDigJQgYSByZXBvIHRoYXQgbXVzdCBOT1Qgb3duIGEgdmFsdWUgKGUuZy4gYSBSYWlsd2F5IHJlZmVyZW5jZVxuLy8gdmFyaWFibGUgcG9pbnRpbmcgYXQgYSBsaW5rZWQgZGF0YWJhc2Ugc2VydmljZSkgc2ltcGx5IGtlZXBzIGl0IG91dCBvZiBmbm94LlxuY29uc3QgTk9OX1JBSUxXQVlfS0VZUyA9IG5ldyBTZXQoWydDSSddKTtcbmNvbnN0IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUyA9IFsnUkFJTFdBWV8nLCAnTklYUEFDS1NfJ107XG5cbmZ1bmN0aW9uIGlzTm9uUmFpbHdheUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTk9OX1JBSUxXQVlfS0VZUy5oYXMoa2V5KSB8fCBOT05fUkFJTFdBWV9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSB2YXJpYWJsZXMgdG8gcHVzaCB0byBSYWlsd2F5IGZyb20gYSByZXNvbHZlZCBlbnZpcm9ubWVudDogZHJvcCBlbXB0eS91bmRlZmluZWQgdmFsdWVzXG4gKiAoc28gYSBgS0VZPWAgcGxhY2Vob2xkZXIgbmV2ZXIgYmxhbmtzIGEgcmVhbCBSYWlsd2F5IHZhcmlhYmxlKSBhbmQgUmFpbHdheS1tYW5hZ2VkIGtleXMsIHNvcnRlZFxuICogZm9yIGEgc3RhYmxlIGNvbW1hbmQgYW5kIGxvZyBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0UmFpbHdheVZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogW3N0cmluZywgc3RyaW5nXVtdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpXG4gICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBbc3RyaW5nLCBzdHJpbmddID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnICYmICFpc05vblJhaWx3YXlLZXkoa2V5KTtcbiAgICB9KVxuICAgIC50b1NvcnRlZCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgUmFpbHdheUVudkNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCByYWlsd2F5RW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAncmFpbHdheS1lbnYnLFxuICBkZXNjcmliZTpcbiAgICAnU3luYyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlY2xhcmVkIGZvciB0aGUgY3VycmVudCBXQl9FTlYgKHJlc29sdmVkIGZyb20gZm5veCkgdG8gdGhlIFJhaWx3YXkgc2VydmljZSwga2VlcGluZyBmbm94IHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBSYWlsd2F5LW1hbmFnZWQga2V5cyAoUkFJTFdBWV8qLCBOSVhQQUNLU18qLCBDSSkgYXJlIG5ldmVyIHB1c2hlZC4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHlhcmdzIGFzIHVua25vd24gYXMgQXJndjxSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IFJhaWx3YXlFbnZDb21tYW5kQXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gUmVzdHJpY3QgdG8gdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSBwcm9qZWN0J3MgZm5veCBzb3VyY2VzOyBpZ25vcmUgcHJvY2Vzcy5lbnYgc29cbiAgICAvLyBSYWlsd2F5J3Mgb3duIGluamVjdGVkIHZhcmlhYmxlcyBuZXZlciBsZWFrIGluLiBUaGUgZWZmZWN0aXZlIHZhbHVlcyBjb21lIGZyb20gcHJvamVjdC5lbnZcbiAgICAvLyAoZm5veC1yZXNvbHZlZCBmb3IgV0JfRU5WKS4gTWlycm9ycyB3YiBkZXBsb3kuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIGBtaXNlIGVudmAgaXMgcmVwb3J0ZWQgYXMgYSBwc2V1ZG8tc291cmNlIHRoYXQgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIFBBVEggYW5kXG4gICAgLy8gQ0FSR09fSE9NRTsgdGhvc2UgbXVzdCBuZXZlciBiZSBwdXNoZWQgdG8gUmFpbHdheSwgc28ga2VlcCBvbmx5IGZub3gtZGVjbGFyZWQga2V5cy5cbiAgICBjb25zdCBmbm94S2V5cyA9IHNlbGVjdEZub3hTb3VyY2VkS2V5cyhlbnZTb3VyY2VzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFmbm94S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gRXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbiBvdmVyIGNvbmZpZ3VyZWQgdmFsdWVzIChtYXRjaGVzIHdiIGRlcGxveSAvIGdlbi1kZXYtdmFycykuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gc2VsZWN0UmFpbHdheVZhcmlhYmxlcyhlbnZWYXJzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ05vIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzeW5jIHRvIFJhaWx3YXkuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleU5hbWVzID0gZW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKGBXb3VsZCBzeW5jICR7ZW50cmllcy5sZW5ndGh9IHZhcmlhYmxlKHMpIHRvIFJhaWx3YXkgKCR7ZW52TmFtZX0pOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIFJhaWx3YXkgQ0xJIHJlYWRzIGF1dGggKFJBSUxXQVlfQVBJX1RPS0VOKSBhbmQgZGVmYXVsdHMgZnJvbSB0aGUgZW52aXJvbm1lbnQ7IHBhc3MgdGhlXG4gICAgLy8gcHJvamVjdC9zZXJ2aWNlL2Vudmlyb25tZW50IGV4cGxpY2l0bHkgd2hlbiBhdmFpbGFibGUgc28gdGhlIGNvbW1hbmQgd29ya3MgdW5hdHRlbmRlZCBpbiBDSS5cbiAgICBjb25zdCBjb250ZXh0QXJnczogc3RyaW5nW10gPSBbJy0tc2tpcC1kZXBsb3lzJ107XG4gICAgaWYgKHByb2Nlc3MuZW52LlJBSUxXQVlfUFJPSkVDVF9JRCkgY29udGV4dEFyZ3MucHVzaChgLS1wcm9qZWN0PSR7cHJvY2Vzcy5lbnYuUkFJTFdBWV9QUk9KRUNUX0lEfWApO1xuICAgIGlmIChwcm9jZXNzLmVudi5SQUlMV0FZX1NFUlZJQ0VfSUQpIGNvbnRleHRBcmdzLnB1c2goYC0tc2VydmljZT0ke3Byb2Nlc3MuZW52LlJBSUxXQVlfU0VSVklDRV9JRH1gKTtcbiAgICBjb250ZXh0QXJncy5wdXNoKGAtLWVudmlyb25tZW50PSR7ZW52TmFtZX1gKTtcbiAgICBjb25zdCBzZXRBcmdzID0gZW50cmllcy5mbGF0TWFwKChba2V5LCB2YWx1ZV0pID0+IFsnLS1zZXQnLCBgJHtrZXl9PSR7dmFsdWV9YF0pO1xuXG4gICAgLy8gc3RkaW86ICdwaXBlJyBrZWVwcyB0aGUgUmFpbHdheSBDTEkncyB2YXJpYWJsZSBsaXN0aW5nICh3aGljaCBlY2hvZXMgdmFsdWVzKSBvdXQgb2YgQ0kgbG9ncztcbiAgICAvLyB0aGlzIGNvbW1hbmQgb25seSBldmVyIHByaW50cyBrZXkgbmFtZXMsIG5ldmVyIHZhbHVlcy5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKCdidW54JywgWydAcmFpbHdheS9jbGknLCAndmFyaWFibGVzJywgLi4uY29udGV4dEFyZ3MsIC4uLnNldEFyZ3NdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBGYWlsZWQgdG8gc3luYyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gUmFpbHdheSAoZXhpdCAke3JldC5zdGF0dXN9KS4gS2V5czogJHtrZXlOYW1lcy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU3luY2VkICR7ZW50cmllcy5sZW5ndGh9IHZhcmlhYmxlKHMpIHRvIFJhaWx3YXkgKCR7ZW52TmFtZX0pOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YCkpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxudHlwZSBSZWxlYXNlQXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBhcmdzPzogdW5rbm93bltdO1xuICAnLS0nPzogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGVhc2VDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncmVsZWFzZSBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgICdSdW4gc2VtYW50aWMtcmVsZWFzZSAob3IgbXVsdGktc2VtYW50aWMtcmVsZWFzZSkgc28gdGhhdCByZXBvc2l0b3JpZXMgdXNpbmcgQnVuIGlzb2xhdGVkIGluc3RhbGxzIGNhbiBwdWJsaXNoIHRvIG5wbTogJyArXG4gICAgXCJyZWluc3RhbGwgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgKG5wbSBjYW5ub3Qgd2FsayBCdW4ncyBpc29sYXRlZCBub2RlX21vZHVsZXMgbGF5b3V0KSwgXCIgK1xuICAgICdyZXdyaXRlIGB3b3Jrc3BhY2U6YCByYW5nZXMgbnBtIGNhbm5vdCBwYXJzZSwgcnVuIHRoZSByZWxlYXNlLCB0aGVuIHJlc3RvcmUgdGhlIG1vZGlmaWVkIGZpbGVzLiAnICtcbiAgICAnRXh0cmEgYXJndW1lbnRzIChlLmcuIGAtLWRlYnVnYCwgYWZ0ZXIgYC0tYCkgYXJlIGZvcndhcmRlZCB0byB0aGUgcmVsZWFzZSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcmVsZWFzZShhcmd2IGFzIFJlbGVhc2VBcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlKGFyZ3Y6IFJlbGVhc2VBcmd2LCBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgLy8gc2VtYW50aWMtcmVsZWFzZSBtdXN0IHJ1biBhdCB0aGUgcmVwb3NpdG9yeSByb290OiBpdCByZWFkcyB0aGUgZ2l0IHJlcG8gYW5kLCBmb3IgbW9ub3JlcG9zLFxuICAvLyBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHdhbGtzIHRoZSB3b3Jrc3BhY2VzIGl0c2VsZi5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLnJvb3Q7XG5cbiAgLy8gTWFwcyBhIG11dGF0ZWQgZmlsZSB0byBpdHMgcHJlLXJlbGVhc2UgY29udGVudCAocmF3IGJ5dGVzIOKAlCBidW4ubG9ja2IgaXMgYmluYXJ5KTsgYHVuZGVmaW5lZGBcbiAgLy8gbWFya3MgYSBmaWxlIHRoYXQgZGlkIG5vdCBleGlzdCBhbmQgbXVzdCBiZSBkZWxldGVkIG9uIHJlc3RvcmUgKGUuZy4gYSBjcmVhdGVkIGxvY2tmaWxlKS5cbiAgY29uc3QgbW9kaWZpZWRGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXIgfCB1bmRlZmluZWQ+KCk7XG4gIC8vIFdpdGggYSBoYW5kbGVyIGluc3RhbGxlZCwgU0lHSU5UL1NJR1RFUk0gbm8gbG9uZ2VyIHRlcm1pbmF0ZSB0aGlzIHByb2Nlc3MsIHNvIHRoZVxuICAvLyBmaW5hbGx5LXJlc3RvcmUgYWx3YXlzIGV4ZWN1dGVzIGFuZCB0aGUgc2lnbmFsIGlzIHJlLXJhaXNlZCBhZnRlcndhcmRzLiBUaGUgaGFuZGxlciBhbHNvXG4gIC8vIEZPUldBUkRTIHRoZSBzaWduYWwgdG8gdGhlIHJ1bm5pbmcgY2hpbGQ6IGNoaWxkcmVuIGFyZSBzcGF3bmVkIGFzeW5jaHJvbm91c2x5IChuZXZlclxuICAvLyBzcGF3blN5bmMsIHdoaWNoIHdvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wIGFuZCBkZWZlciB0aGUgaGFuZGxlciB1bnRpbCBhZnRlciB0aGUgY2hpbGQg4oCUXG4gIC8vIGFuZCBhIHB1Ymxpc2gg4oCUIGNvbXBsZXRlZCksIHNvIGEgc2lnbmFsIHRhcmdldGVkIGF0IHRoaXMgcHJvY2VzcyBhbG9uZSBzdGlsbCBjYW5jZWxzIHRoZVxuICAvLyBjaGlsZCBwcm9tcHRseS5cbiAgbGV0IHJlY2VpdmVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmID0geyBjdXJyZW50OiB1bmRlZmluZWQgfTtcbiAgY29uc3Qgc2lnbmFsSGFuZGxlciA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgcmVjZWl2ZWRTaWduYWwgPSBzaWduYWw7XG4gICAgLy8gdHJlZUtpbGwgKG5vdCBjaGlsZC5raWxsKTogc2VtYW50aWMtcmVsZWFzZSBhbmQgYnVuIGluc3RhbGwgc3Bhd24gdGhlaXIgb3duIHN1YnByb2Nlc3Nlc1xuICAgIC8vIChucG0gcHVibGlzaCwgZ2l0IHB1c2gsIC4uLiksIHdoaWNoIG11c3Qgbm90IGtlZXAgcHVibGlzaGluZyBhZnRlciB3YiByZXBvcnRzIGNhbmNlbGxhdGlvbi5cbiAgICAvLyB0cmVlS2lsbCBUSFJPV1MgKG1pc3NpbmcvdGltaW5nLW91dCBgcHNgLCBFUEVSTSksIGFuZCBhbiBleGNlcHRpb24gZXNjYXBpbmcgYSBzaWduYWxcbiAgICAvLyBsaXN0ZW5lciB3b3VsZCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MgYW5kIHNraXAgdGhlIHJlc3RvcmluZyBmaW5hbGx5IOKAlCBzbyBkZWdyYWRlIHRvXG4gICAgLy8ga2lsbGluZyB0aGUgZGlyZWN0IGNoaWxkIGluc3RlYWQuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3RpdmVDaGlsZC5jdXJyZW50Py5waWQpIHRyZWVLaWxsKGFjdGl2ZUNoaWxkLmN1cnJlbnQucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHRlcm1pbmF0ZSB0aGUgcmVsZWFzZSBjaGlsZCBwcm9jZXNzIHRyZWU6ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50Py5raWxsKHNpZ25hbCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBndWFyZGVkU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9IFsnU0lHSU5UJywgJ1NJR1RFUk0nXTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgZ3VhcmRlZFNpZ25hbHMpIHByb2Nlc3Mub24oc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcblxuICBsZXQgZXhpdENvZGUgPSAwO1xuICBsZXQgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGZhbHNlO1xuICB0cnkge1xuICAgIGlmIChhd2FpdCByZWxlYXNlUHVibGlzaGVzVG9OcG0ocHJvamVjdCkpIHtcbiAgICAgIGF3YWl0IHByZXBhcmVOcG1Db21wYXRpYmxlTGF5b3V0KHByb2plY3QsIGFyZ3YsIG1vZGlmaWVkRmlsZXMsIGFjdGl2ZUNoaWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIGFuZCB3b3Jrc3BhY2UtcmFuZ2UgcmV3cml0ZSBleGlzdCBzb2xlbHkgc28gbnBtICh3aGljaCB0aGVcbiAgICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2FuIGRpZ2VzdCB0aGUgY2hlY2tvdXQ7IHdpdGhvdXQgdGhhdCBwbHVnaW5cbiAgICAgIC8vIHRoZSByZWxlYXNlIHJ1bnMgZGlyZWN0bHkgb24gdGhlIGlzb2xhdGVkIGxheW91dCAoaXNzdWUgIzEwMDApLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICdTa2lwcGluZyB0aGUgaG9pc3RlZCByZWluc3RhbGwgYmVjYXVzZSB0aGUgc2VtYW50aWMtcmVsZWFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGluY2x1ZGUgQHNlbWFudGljLXJlbGVhc2UvbnBtLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQSBzaWduYWwgbWF5IGhhdmUgYXJyaXZlZCBiZXR3ZWVuIGNoaWxkcmVuIChub3RoaW5nIHRvIGZvcndhcmQgdG8gYXQgdGhhdCBpbnN0YW50KSwgc28gaXRcbiAgICAvLyBtdXN0IGJlIGNoZWNrZWQgZXhwbGljaXRseSBiZWZvcmUgYW55dGhpbmcgcHVibGlzaGVzLlxuICAgIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYm9ydGVkIGJ5ICR7cmVjZWl2ZWRTaWduYWx9IGJlZm9yZSBydW5uaW5nIHRoZSByZWxlYXNlLmApO1xuICAgIH1cbiAgICBleGl0Q29kZSA9IGF3YWl0IHJ1blNlbWFudGljUmVsZWFzZShwcm9qZWN0LCBhcmd2LCBhY3RpdmVDaGlsZCk7XG4gICAgLy8gUmVjb3JkZWQgc2VwYXJhdGVseSBmcm9tIHJlY2VpdmVkU2lnbmFsOiBhIHNpZ25hbCBhcnJpdmluZyBBRlRFUiBhIHN1Y2Nlc3NmdWwgcHVibGlzaCBtdXN0XG4gICAgLy8gbm90IGRlbW90ZSB0aGUgcmVzdG9yZSB0byBieXRlLWZvci1ieXRlICh0aGF0IHdvdWxkIHJldmVydCB0aGUgcHVibGlzaGVkIHZlcnNpb24gYnVtcHMpLlxuICAgIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkgPSBleGl0Q29kZSA9PT0gMDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBFcnJvcnMgbXVzdCB1bndpbmQgdGhyb3VnaCB0aGlzIHRyeSAobmV2ZXIgYHByb2Nlc3MuZXhpdGAgaW5zaWRlIGl0KTogdGhlIHJlc3RvcmUgYmVsb3cgaXNcbiAgICAvLyB0aGUgb25seSB0aGluZyB0aGF0IHVuZG9lcyB0aGUgYnVuZmlnL3BhY2thZ2UuanNvbiBtdXRhdGlvbnMuXG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKSk7XG4gICAgZXhpdENvZGUgPSAxO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIE9uIGZhaWx1cmUgb3IgaW50ZXJydXB0aW9uLCByZXN0b3JlIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UgbWF5IGhhdmUgbGVmdCBQQVJUSUFMXG4gICAgLy8gZWRpdHMgKGUuZy4gYSB2ZXJzaW9uIGJ1bXAgd2l0aG91dCBhIHB1Ymxpc2gpLCB3aGljaCBtdXN0IG5vdCBzdXJ2aXZlLiBUaGUgc2VtYW50aWNcbiAgICAvLyB3b3Jrc3BhY2UtcmFuZ2UgcmVzdG9yZSBpcyByZXNlcnZlZCBmb3IgYSBzdWNjZXNzZnVsIHJlbGVhc2UuXG4gICAgY29uc3QgcmVzdG9yZWRGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIG1vZGlmaWVkRmlsZXMpIHtcbiAgICAgIGlmIChyZXN0b3JlTW9kaWZpZWRGaWxlKGZpbGVQYXRoLCBjb250ZW50LCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5KSkgcmVzdG9yZWRGaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmIChyZXN0b3JlZEZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFJlc3RvcmVkICR7cmVzdG9yZWRGaWxlUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgcCkpLmpvaW4oJywgJyl9LmApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBUaGUgaGludCBhcHBsaWVzIG9ubHkgd2hlbiB0aGUgaG9pc3RlZCByZWluc3RhbGwgYWN0dWFsbHkgcmFuOyBidW5maWcudG9tbCBpcyBzbmFwc2hvdHRlZFxuICAgIC8vIGV4YWN0bHkgaW4gdGhhdCBicmFuY2guXG4gICAgY29uc3QgcmVpbnN0YWxsZWRXaXRoSG9pc3RlZExpbmtlciA9IFsuLi5tb2RpZmllZEZpbGVzLmtleXMoKV0uc29tZShcbiAgICAgIChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdidW5maWcudG9tbCdcbiAgICApO1xuICAgIGlmIChyZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyICYmICFpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgJ25vZGVfbW9kdWxlcyBub3cgdXNlcyB0aGUgaG9pc3RlZCBsYXlvdXQ7IHJ1biBhIGNsZWFuIHJlaW5zdGFsbCAoYHJtIC1yZiBub2RlX21vZHVsZXMgcGFja2FnZXMvKi9ub2RlX21vZHVsZXMgJiYgYnVuIGluc3RhbGxgKSB0byByZXN0b3JlIHRoZSBpc29sYXRlZCBsYXlvdXQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vZmYoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgfVxuICBpZiAocmVjZWl2ZWRTaWduYWwpIHtcbiAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHJlY2VpdmVkU2lnbmFsKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQWN0aXZlQ2hpbGRSZWYge1xuICBjdXJyZW50OiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTcGF3biBhc3luY2hyb25vdXNseSBhbmQgYXdhaXQgdGhlIGV4aXQgc3RhdHVzLiBUaGUgZXZlbnQgbG9vcCBzdGF5cyBmcmVlLCBzbyBwYXJlbnQtb25seVxuICogc2lnbmFscyBhcmUgaGFuZGxlZCBwcm9tcHRseSBhbmQgZm9yd2FyZGVkIHRvIHRoZSBjaGlsZCBieSByZWxlYXNlKCkncyBzaWduYWwgaGFuZGxlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3Bhd25BbmRXYWl0KFxuICBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYsXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IGNoaWxkX3Byb2Nlc3MuU3Bhd25PcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRfcHJvY2Vzcy5zcGF3bihjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcbiAgICBhY3RpdmVDaGlsZC5jdXJyZW50ID0gY2hpbGQ7XG4gICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcmVzb2x2ZSgxKTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShjb2RlID8/IDEpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWxlYXNlIGNhbiBwdWJsaXNoIHRvIG5wbS4gVHJ1ZSB1bmxlc3MgYSBwbHVnaW4gbGlzdCBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWRcbiAqIChpbiBhIEpTT04tcGFyc2VhYmxlIHNvdXJjZSkgYW5kIG9taXRzIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIGV2ZXJ5d2hlcmUgaW4gc2NvcGUg4oCUIHRoZSByb290XG4gKiBhbmQsIGZvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIG1vbm9yZXBvcywgZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSAoYSBwYWNrYWdlLWxldmVsIHBsdWdpbiBsaXN0XG4gKiBvdmVycmlkZXMgdGhlIHJvb3QncykuIHNlbWFudGljLXJlbGVhc2UncyBERUZBVUxUIHBsdWdpbiBsaXN0IGluY2x1ZGVzIHRoZSBucG0gcGx1Z2luLCBzbyBhXG4gKiBtaXNzaW5nIHBsdWdpbiBsaXN0LCBhIG5vbi1KU09OIGNvbmZpZyBmaWxlLCBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IGNvbnNlcnZhdGl2ZWx5IGtlZXBzIHRoZVxuICogbnBtIHByZXBhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZVB1Ymxpc2hlc1RvTnBtKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvbicgfCAndXNlc0J1blBhY2thZ2VNYW5hZ2VyJz5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByb290UGx1Z2lucyA9IHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnBhY2thZ2VKc29uKTtcbiAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCByb290IHBsdWdpbiBsaXN0LCBzZW1hbnRpYy1yZWxlYXNlJ3MgZGVmYXVsdCBsaXN0IChucG0gaW5jbHVkZWQpIGFwcGxpZXMuXG4gIGlmICghQXJyYXkuaXNBcnJheShyb290UGx1Z2lucykgfHwgcGx1Z2luc0luY2x1ZGVOcG0ocm9vdFBsdWdpbnMpKSByZXR1cm4gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IHBhY2thZ2VEaXJQYXRoIG9mIGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KSkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKHBhY2thZ2VEaXJQYXRoLCB1bmRlZmluZWQpO1xuICAgIC8vIEEgd29ya3NwYWNlIHBhY2thZ2Ugd2l0aG91dCBpdHMgb3duIHBsdWdpbiBsaXN0IGluaGVyaXRzIHRoZSByb290J3MgKG5wbS1mcmVlKSBkZWNpc2lvbi5cbiAgICBpZiAocGx1Z2lucyA9PT0gJ3Vua25vd24nIHx8IChBcnJheS5pc0FycmF5KHBsdWdpbnMpICYmIHBsdWdpbnNJbmNsdWRlTnBtKHBsdWdpbnMpKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwbHVnaW5zSW5jbHVkZU5wbShwbHVnaW5zOiByZWFkb25seSB1bmtub3duW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHBsdWdpbnMuc29tZSgocGx1Z2luKSA9PiAoQXJyYXkuaXNBcnJheShwbHVnaW4pID8gcGx1Z2luWzBdIDogcGx1Z2luKSA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpO1xufVxuXG4vKipcbiAqIGNvc21pY29uZmlnIDkncyBkZWZhdWx0IHNlYXJjaFBsYWNlcyBvcmRlciBmb3IgbW9kdWxlIFwicmVsZWFzZVwiICh3aGF0IHNlbWFudGljLXJlbGVhc2UgMjVcbiAqIGRlbGVnYXRlcyB0byksIG1pbnVzIHRoZSBsZWFkaW5nIHBhY2thZ2UuanNvbiBlbnRyeSwgd2hpY2ggdGhlIGNhbGxlciBjaGVja3MgZmlyc3QuIFRoZSBGSVJTVFxuICogZXhpc3RpbmcgcGxhY2Ugd2luczsgcGxhY2VzIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIG1ha2UgdGhlIGVmZmVjdGl2ZSBwbHVnaW5cbiAqIGxpc3QgJ3Vua25vd24nLlxuICovXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXM6IHsgZmlsZU5hbWU6IHN0cmluZzsganNvblBhcnNlYWJsZTogYm9vbGVhbiB9W10gPSBbXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qc29uJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55YW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy50cycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy55YW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy50cycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuXTtcblxuZnVuY3Rpb24gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWRcbik6IHJlYWRvbmx5IHVua25vd25bXSB8IHVuZGVmaW5lZCB8ICd1bmtub3duJyB7XG4gIC8vIGNvc21pY29uZmlnIHNlYXJjaGVzIHBhY2thZ2UuanNvbidzIGByZWxlYXNlYCBrZXkgQkVGT1JFIGFueSByYy9jb25maWcgZmlsZTsgYSBtaXNzaW5nIG9yXG4gIC8vIHVucmVhZGFibGUgcGFja2FnZS5qc29uIGp1c3QgZmFsbHMgdGhyb3VnaCB0byB0aGUgZmlsZSBzZWFyY2ggcGxhY2VzLlxuICBpZiAocGFja2FnZUpzb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcGFja2FnZUpzb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIGxldCBjb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogeyBwbHVnaW5zPzogdW5rbm93bjsgZXh0ZW5kcz86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVsZWFzZTtcbiAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgY29udGludWU7XG4gICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHJldHVybiAndW5rbm93bic7XG4gICAgICB0cnkge1xuICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKSBhcyB0eXBlb2YgY29uZmlnO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5wbHVnaW5zKSkgcmV0dXJuIGNvbmZpZy5wbHVnaW5zO1xuICAvLyBBbiBgZXh0ZW5kc2AgcHJlc2V0IG1heSBjb250cmlidXRlIGl0cyBvd24gcGx1Z2luIGxpc3QsIHdoaWNoIGNhbm5vdCBiZSByZXNvbHZlZCBzdGF0aWNhbGx5LlxuICByZXR1cm4gY29uZmlnLmV4dGVuZHMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICd1bmtub3duJztcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBjaGVja291dCBkaWdlc3RpYmxlIGZvciBucG0sIHdoaWNoIHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8gZm9yXG4gKiBgbnBtIHZlcnNpb25gIC8gYG5wbSBwdWJsaXNoYDpcbiAqIDEuIG5wbSdzIGFyYm9yaXN0IGNhbm5vdCB3YWxrIEJ1bidzIElTT0xBVEVEIG5vZGVfbW9kdWxlcyBsYXlvdXQgKHRoZSBgLmJ1bmAgc3ltbGluayBmYXJtKSwgc29cbiAqICAgIGNsZWFuLXJlaW5zdGFsbCB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciBmaXJzdC4gQSBub24tY2xlYW4gbGlua2VyIHN3aXRjaCB3b3VsZCBsZWF2ZSBzdGFsZVxuICogICAgZ2xvYmFsLXN0b3JlIHN5bWxpbmtzIGJlaGluZCAocGFja2FnZXMgdGhlbiByZXNvbHZlIGZyb20gfi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3Mgd2hlcmVcbiAqICAgIHBoYW50b20gZGVwZW5kZW5jaWVzIGFyZSB1bnJlYWNoYWJsZSksIHNvIGV2ZXJ5IG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgaXMgd2lwZWQgZmlyc3QuXG4gKiAyLiBucG0gY2Fubm90IHBhcnNlIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzLCB3aGlsZSBCdW4gUkVRVUlSRVMgdGhlIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsXG4gKiAgICBsaW5rcyB0aGUgd29ya3NwYWNlIOKAlCBzbyByZXdyaXRlIHRoZSByYW5nZXMgdG8gYCpgIEFGVEVSIHRoZSByZWluc3RhbGwgKEJ1biBtdXN0IHN0aWxsIHNlZVxuICogICAgdGhlIHByb3RvY29sIHdoaWxlIGluc3RhbGxpbmc7IG5wbSBvbmx5IG5lZWRzIHRoZSBtYW5pZmVzdCBURVhUIHRvIGJlIHBhcnNlYWJsZSkuIFRoZVxuICogICAgYWZmZWN0ZWQgbWFuaWZlc3RzIGFyZSBwcml2YXRlL3VucHVibGlzaGVkIG9yIHJld3JpdHRlbiBieSB0aGUgbnBtIHBsdWdpbiBvbiBwdWJsaXNoLlxuICogQWxsIG11dGF0aW9ucyBhcmUgcmVzdG9yZWQgYnkgdGhlIGNhbGxlciBhZnRlciB0aGUgcmVsZWFzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZU5wbUNvbXBhdGlibGVMYXlvdXQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFJlbGVhc2VBcmd2LFxuICBtb2RpZmllZEZpbGVzOiBNYXA8c3RyaW5nLCBCdWZmZXIgfCB1bmRlZmluZWQ+LFxuICBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWZcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBidW5maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gIGNvbnN0IGJ1bmZpZyA9IGZzLmV4aXN0c1N5bmMoYnVuZmlnUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoYnVuZmlnUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaG9pc3RlZEJ1bmZpZyA9IGJ1bmZpZyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZyk7XG4gIGlmIChidW5maWcgIT09IHVuZGVmaW5lZCAmJiBob2lzdGVkQnVuZmlnICE9PSBidW5maWcpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbignQ2xlYW4tcmVpbnN0YWxsaW5nIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIHNvIG5wbSBjYW4gd2FsayBub2RlX21vZHVsZXMuLi4nKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbW9kaWZpZWRGaWxlcy5zZXQoYnVuZmlnUGF0aCwgQnVmZmVyLmZyb20oYnVuZmlnLCAndXRmOCcpKTtcbiAgICAgIC8vIFRoZSBob2lzdGVkIHJlaW5zdGFsbCBtYXkgcmV3cml0ZSAob3IgY3JlYXRlKSB0aGUgbG9ja2ZpbGU7IHNuYXBzaG90IHRoZSByYXcgYnl0ZXMgc28gYVxuICAgICAgLy8gc3VjY2Vzc2Z1bCByZWxlYXNlIGxlYXZlcyBubyB0cmFja2VkIG9yIHVudHJhY2tlZCBsb2NrZmlsZSBjaGFuZ2VzIGJlaGluZC5cbiAgICAgIGZvciAoY29uc3QgbG9ja0ZpbGVOYW1lIG9mIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10pIHtcbiAgICAgICAgY29uc3QgbG9ja0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbG9ja0ZpbGVOYW1lKTtcbiAgICAgICAgbW9kaWZpZWRGaWxlcy5zZXQobG9ja0ZpbGVQYXRoLCBmcy5leGlzdHNTeW5jKGxvY2tGaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMobG9ja0ZpbGVQYXRoKSA6IHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGJ1bmZpZ1BhdGgsIGhvaXN0ZWRCdW5maWcgPz8gJycsICd1dGY4Jyk7XG4gICAgICBjb25zdCBub2RlTW9kdWxlc0RpclBhdGhzID0gW3Byb2plY3QuZGlyUGF0aCwgLi4uKGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KSldLm1hcCgoZGlyUGF0aCkgPT5cbiAgICAgICAgcGF0aC5qb2luKGRpclBhdGgsICdub2RlX21vZHVsZXMnKVxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRoIG9mIG5vZGVNb2R1bGVzRGlyUGF0aHMpIHtcbiAgICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgLy8gUmVzb2x2ZSBhbmQgZG93bmxvYWQgd2l0aCBsaWZlY3ljbGUgc2NyaXB0cyBESVNBQkxFRCB3aGlsZSB0aGUgcmVsZWFzZSBjcmVkZW50aWFsc1xuICAgICAgLy8gKFZFUkRBQ0NJT19UT0tFTiwgTlBNX1RPS0VOLCBHSVRIVUJfVE9LRU4sIEZOT1hfQUdFX0tFWSwgLi4uKSBhcmUgaW4gdGhlIGVudmlyb25tZW50LFxuICAgICAgLy8gc28gcmVwb3NpdG9yeS0gb3IgZGVwZW5kZW5jeS1kZWZpbmVkIHByZWluc3RhbGwvcG9zdGluc3RhbGwgY2FuIG5ldmVyIHJlYWQgdGhlbSDigJRcbiAgICAgIC8vIG1pcnJvcmluZyByZXVzYWJsZS13b3JrZmxvd3MnIHR3by1zdGVwIHJlbGVhc2UgaW5zdGFsbCAoaXNzdWUgIzEwMDMpLlxuICAgICAgY29uc3QgaW5zdGFsbFN0YXR1cyA9IGF3YWl0IHNwYXduQW5kV2FpdChhY3RpdmVDaGlsZCwgJ2J1bicsIFsnaW5zdGFsbCcsICctLWlnbm9yZS1zY3JpcHRzJ10sIHtcbiAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChpbnN0YWxsU3RhdHVzICE9PSAwKSB7XG4gICAgICAgIC8vIFRocm93aW5nIChpbnN0ZWFkIG9mIHByb2Nlc3MuZXhpdCwgd2hpY2ggd291bGQgc2tpcCB0aGUgY2FsbGVyJ3MgZmluYWxseSkgbGV0cyB0aGVcbiAgICAgICAgLy8gcmVzdG9yZSBydW4gYmVmb3JlIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYnVuIGluc3RhbGwgZmFpbGVkIHdoaWxlIHByZXBhcmluZyB0aGUgcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxheSB0aGUgc2tpcHBlZCBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIGNyZWRlbnRpYWwtc2NydWJiZWQgZW52aXJvbm1lbnQuIEEgcmVwZWF0ZWRcbiAgICAgIC8vIGBidW4gaW5zdGFsbGAgaXMgYSBuby1vcCB0aGF0IGRvZXMgbm90IHJlcGxheSB0aGVtLCBzbyBub2RlX21vZHVsZXMgaXMgd2lwZWQgYWdhaW47XG4gICAgICAvLyBldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgaW4gYnVuJ3MgY2FjaGUgZnJvbSB0aGUgY3JlZGVudGlhbGVkIHN0ZXAsIHNvIHRoaXMgcmUtbGlua1xuICAgICAgLy8gbmVlZHMgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMuXG4gICAgICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aCBvZiBub2RlTW9kdWxlc0RpclBhdGhzKSB7XG4gICAgICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGxheVN0YXR1cyA9IGF3YWl0IHNwYXduQW5kV2FpdChhY3RpdmVDaGlsZCwgJ2J1bicsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICBlbnY6IGJ1aWxkQ3JlZGVudGlhbEZyZWVFbnYocHJvamVjdC5lbnYpLFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVwbGF5U3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYnVuIGluc3RhbGwgZmFpbGVkIHdoaWxlIHJlcGxheWluZyBsaWZlY3ljbGUgc2NyaXB0cyBmb3IgdGhlIHJlbGVhc2UuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIFtcbiAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCxcbiAgICAuLi53b3Jrc3BhY2VQYWNrYWdlRGlycy5tYXAoKGRpclBhdGgpID0+IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICBdKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgb3JpZ2luYWwgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIC8vIFNuYXBzaG90IEVWRVJZIG1hbmlmZXN0IChub3Qgb25seSByZXdyaXR0ZW4gb25lcyk6IHNlbWFudGljLXJlbGVhc2UgYWxzbyBlZGl0cyBtYW5pZmVzdHNcbiAgICAvLyB3aXRob3V0IHdvcmtzcGFjZTogcmFuZ2VzICh2ZXJzaW9uIGJ1bXBzKSwgYW5kIGEgZmFpbGVkIHJlbGVhc2UgbXVzdCByZXN0b3JlIHRob3NlIHRvby5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChwYWNrYWdlSnNvblBhdGgsIEJ1ZmZlci5mcm9tKG9yaWdpbmFsLCAndXRmOCcpKTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhvcmlnaW5hbCk7XG4gICAgaWYgKHJld3JpdHRlbiA9PT0gb3JpZ2luYWwpIGNvbnRpbnVlO1xuXG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJld3JpdGluZyB3b3Jrc3BhY2U6IHJhbmdlcyBpbiAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfS4uLmApKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgcmV3cml0dGVuLCAndXRmOCcpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgY3JlZGVudGlhbHMgdGhlIHJlbGVhc2Ugd29ya2Zsb3cgaW5qZWN0cyAoY2YuIHJldXNhYmxlLXdvcmtmbG93cycgcmVsZWFzZS55bWwgc2VjcmV0cyBhbmRcbi8vIG5wbSdzIG93biB0b2tlbiB2YXJpYWJsZXMpLiBUaGUgcmVsZWFzZSBjb21tYW5kIGxvYWRzIHRoZSBwcm9qZWN0IHdpdGggbG9hZEVudjogZmFsc2UsIHNvIG5vXG4vLyB3Yi1sb2FkZXItaW5qZWN0ZWQga2V5cyBleGlzdCB0byBzY3J1YiBiZXlvbmQgdGhlc2UuIEEgZGVueWxpc3QgKG5vdCBhbiBhbGxvd2xpc3QpIGlzXG4vLyBkZWxpYmVyYXRlOiBpbiB0aGUgc3VwcG9ydGVkIGVudHJ5IHBvaW50IOKAlCByZXVzYWJsZS13b3JrZmxvd3MnIHJlbGVhc2Ugam9iIOKAlCB0aGVzZSBlbnVtZXJhdGVkXG4vLyB2YXJpYWJsZXMgYXJlIHRoZSBPTkxZIHNlY3JldHMgaW4gdGhlIGFtYmllbnQgZW52aXJvbm1lbnQgKGZub3ggc2VjcmV0cyBzdGF5IGVuY3J5cHRlZCBiZWNhdXNlXG4vLyBGTk9YX0FHRV9LRVkgaXMgc2NydWJiZWQgYW5kIG5ldmVyIGV4cG9ydGVkIGFzIHBsYWludGV4dCB0aGVyZSksIHdoaWxlIGFuIGFsbG93bGlzdCB3b3VsZFxuLy8gYnJlYWsgbGlmZWN5Y2xlIHNjcmlwdHMgdGhhdCBsZWdpdGltYXRlbHkgcmVhZCBvcGVyYXRpb25hbCB2YXJpYWJsZXMgKFBBVEgsIEhPTUUsIENJLCAuLi4pLlxuLy8gQSBsb2NhbCBgd2IgcmVsZWFzZWAgaW5oZXJpdHMgd2hhdGV2ZXIgdGhlIGRldmVsb3BlcidzIHNoZWxsIGFscmVhZHkgZXhwb3NlcyB0byBldmVyeVxuLy8gYGJ1biBpbnN0YWxsYCwgd2hpY2ggdGhpcyByZXBsYXkgZG9lcyBub3Qgd2lkZW4uXG5jb25zdCBjcmVkZW50aWFsRW52VmFyTmFtZXMgPSBbXG4gICdWRVJEQUNDSU9fVE9LRU4nLFxuICAnTlBNX1RPS0VOJyxcbiAgJ05PREVfQVVUSF9UT0tFTicsXG4gICdHSVRIVUJfVE9LRU4nLFxuICAnR0hfVE9LRU4nLFxuICAnR0hfUEFDS0FHRVNfVE9LRU4nLFxuICAnR0hfUEtHX1JFQURfVE9LRU4nLFxuICAnRk5PWF9BR0VfS0VZJyxcbl07XG5cbi8qKlxuICogQSBjb3B5IG9mIGBlbnZgIHNhZmUgdG8gZXhwb3NlIHRvIGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMuIENyZWRlbnRpYWwgdmFyaWFibGVzIGFyZVxuICogRU1QVElFRCByYXRoZXIgdGhhbiBkZWxldGVkIHNvIGAke1ZFUkRBQ0NJT19UT0tFTn1gLXN0eWxlIHJlZmVyZW5jZXMgaW4gLm5wbXJjIGtlZXAgZXhwYW5kaW5nXG4gKiB0byAnJyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHRoZSBpbnN0YWxsICh0aGUgcGF0dGVybiByZXVzYWJsZS13b3JrZmxvd3MgcmVsaWVzIG9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ3JlZGVudGlhbEZyZWVFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNjcnViYmVkRW52ID0geyAuLi5lbnYgfTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGNyZWRlbnRpYWxFbnZWYXJOYW1lcykge1xuICAgIGlmIChuYW1lIGluIHNjcnViYmVkRW52KSBzY3J1YmJlZEVudltuYW1lXSA9ICcnO1xuICB9XG4gIHJldHVybiBzY3J1YmJlZEVudjtcbn1cblxuLyoqXG4gKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVsZWFzZS10aW1lIG11dGF0aW9ucyBvZiBvbmUgZmlsZS4gYHBhY2thZ2UuanNvbmAgZmlsZXMgYXJlIHJlc3RvcmVkXG4gKiBzZW1hbnRpY2FsbHkgaW5zdGVhZCBvZiBieXRlLWZvci1ieXRlOiBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiB3cml0ZXMgdGhlIHJlbGVhc2VkXG4gKiB2ZXJzaW9uIGludG8gbWFuaWZlc3RzIHdoaWxlIHRoZXkgaG9sZCB0aGUgcmV3cml0dGVuIHJhbmdlcywgYW5kIGEgYnl0ZSByZXN0b3JlIHdvdWxkIHNpbGVudGx5XG4gKiByZXZlcnQgdGhhdCBidW1wIOKAlCBzbyB3aGVuIHRoZSBmaWxlIGNoYW5nZWQgZHVyaW5nIHRoZSByZWxlYXNlLCBvbmx5IHRoZSBgd29ya3NwYWNlOmBcbiAqIHNwZWNpZmllcnMgYXJlIHdyaXR0ZW4gYmFjayBpbnRvIHRoZSBDVVJSRU5UIGNvbnRlbnQuXG4gKi9cbi8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9uLWRpc2sgY29udGVudCBhY3R1YWxseSBjaGFuZ2VkIChkcml2ZXMgdGhlIFwiUmVzdG9yZWQgLi4uXCIgbWVzc2FnZSkuICovXG5mdW5jdGlvbiByZXN0b3JlTW9kaWZpZWRGaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBvcmlnaW5hbENvbnRlbnQ6IEJ1ZmZlciB8IHVuZGVmaW5lZCxcbiAgcmVsZWFzZVN1Y2NlZWRlZDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGlmIChvcmlnaW5hbENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGV4aXN0ZWQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKTtcbiAgICBmcy5ybVN5bmMoZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIGV4aXN0ZWQ7XG4gIH1cbiAgaWYgKHJlbGVhc2VTdWNjZWVkZWQgJiYgcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdwYWNrYWdlLmpzb24nICYmIGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgY29uc3QgY3VycmVudENvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gb3JpZ2luYWxDb250ZW50LnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgaWYgKGN1cnJlbnRDb250ZW50ICE9PSByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKG9yaWdpbmFsVGV4dCkpIHtcbiAgICAgIGNvbnN0IHJlc3RvcmVkQ29udGVudCA9IHJlc3RvcmVXb3Jrc3BhY2VSYW5nZXMoY3VycmVudENvbnRlbnQsIG9yaWdpbmFsVGV4dCk7XG4gICAgICBpZiAocmVzdG9yZWRDb250ZW50ID09PSBjdXJyZW50Q29udGVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcmVzdG9yZWRDb250ZW50LCAndXRmOCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGNvbnN0IGN1cnJlbnRCdWZmZXIgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCkgOiB1bmRlZmluZWQ7XG4gIGlmIChjdXJyZW50QnVmZmVyPy5lcXVhbHMob3JpZ2luYWxDb250ZW50KSkgcmV0dXJuIGZhbHNlO1xuICAvLyBXcml0ZSB0aGUgc25hcHNob3QgYnl0ZXMgdmVyYmF0aW06IGJ1bi5sb2NrYiBpcyBiaW5hcnksIHNvIGFueSB0ZXh0IGRlY29kZS9lbmNvZGUgcm91bmQgdHJpcFxuICAvLyB3b3VsZCBjb3JydXB0IGl0LlxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBvcmlnaW5hbENvbnRlbnQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSG9pc3RlZEJ1bmZpZyhidW5maWc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBidW5maWdcbiAgICAucmVwbGFjZSgvXihcXHMqbGlua2VyXFxzKj1cXHMqKVtcIiddaXNvbGF0ZWRbXCInXS9tdSwgJyQxXCJob2lzdGVkXCInKVxuICAgIC5yZXBsYWNlKC9eXFxzKmdsb2JhbFN0b3JlXFxzKj1cXHMqdHJ1ZVteXFxuXSpcXG4/L211LCAnJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT3BlcmF0ZSBvbmx5IGluc2lkZSB0aGUgZGVwZW5kZW5jeSBzZWN0aW9uczogYSBibGFua2V0IGBcIndvcmtzcGFjZTouLi5cImAgcmVwbGFjZW1lbnQgd291bGRcbiAgLy8gYWxzbyBjb3JydXB0IHVucmVsYXRlZCBzdHJpbmcgdmFsdWVzIChlLmcuIGEgZGVzY3JpcHRpb24gc3RhcnRpbmcgd2l0aCBgd29ya3NwYWNlOmApLCBhbmQgYVxuICAvLyBuYW1lLWtleWVkIGdsb2JhbCByZXBsYWNlbWVudCB3b3VsZCB0b3VjaCBzYW1lLW5hbWVkIGtleXMgaW4gb3RoZXIgc2VjdGlvbnMgKGUuZy4gb3ZlcnJpZGVzKS5cbiAgcmV0dXJuIHJlcGxhY2VJbkRlcGVuZGVuY3lTZWN0aW9ucyhwYWNrYWdlSnNvbkNvbnRlbnQsIChzZWN0aW9uKSA9PlxuICAgIHNlY3Rpb24ucmVwbGFjZUFsbCgvKFwiW15cIlxcbl0rXCJcXHMqOlxccyopXCJ3b3Jrc3BhY2U6W15cIl0qXCIvZ3UsICckMVwiKlwiJylcbiAgKTtcbn1cblxuLyoqXG4gKiBSZS1hcHBseSB0aGUgb3JpZ2luYWwgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMgdG8gdGhlIENVUlJFTlQgbWFuaWZlc3QgY29udGVudC4gTWF0Y2hpbmcga2V5c1xuICogb2ZmIHRoZSBkZXBlbmRlbmN5IE5BTUUgKG5vdCB0aGUgYFwiKlwiYCBwbGFjZWhvbGRlcikgaXMgZGVsaWJlcmF0ZTogbXVsdGktc2VtYW50aWMtcmVsZWFzZSdzXG4gKiBwcmVwYXJlIHN0ZXAgb3ZlcndyaXRlcyBsb2NhbCBkZXBlbmRlbmN5IHNwZWNpZmllcnMgd2l0aCBjb25jcmV0ZSByZWxlYXNlZCB2ZXJzaW9ucywgYW5kIHRoZVxuICogY29tbWl0dGVkIG1hbmlmZXN0IG11c3QgZ2V0IGl0cyBgd29ya3NwYWNlOmAgcHJvdG9jb2wgYmFjayByZWdhcmRsZXNzIOKAlCBCdW4gcmVxdWlyZXMgdGhlXG4gKiBwcm90b2NvbCBzbyBhIGNvbGQgaW5zdGFsbCBsaW5rcyB0aGUgd29ya3NwYWNlIGluc3RlYWQgb2YgcmVzb2x2aW5nIGEgcmVnaXN0cnkgY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVXb3Jrc3BhY2VSYW5nZXMoY3VycmVudENvbnRlbnQ6IHN0cmluZywgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMgPSBjb2xsZWN0V29ya3NwYWNlRGVwZW5kZW5jaWVzKG9yaWdpbmFsQ29udGVudCk7XG4gIC8vIFJlc3RvcmUgcGVyIChzZWN0aW9uLCBuYW1lKTogYSBzYW1lLW5hbWVkIGRlcGVuZGVuY3kgaW4gYW5vdGhlciBzZWN0aW9uIG1heSBsZWdpdGltYXRlbHlcbiAgLy8gaG9sZCBhIG5vbi13b3Jrc3BhY2UgcmFuZ2UgKGUuZy4gYSBwZWVyRGVwZW5kZW5jaWVzIGA+PTEuMC4wYCBuZXh0IHRvIGEgZGV2RGVwZW5kZW5jaWVzXG4gIC8vIGB3b3Jrc3BhY2U6KmApIG9yIGEgZGlmZmVyZW50IHdvcmtzcGFjZSByYW5nZSwgYW5kIG11c3Qga2VlcCBpdHMgb3duIHZhbHVlLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKGN1cnJlbnRDb250ZW50LCAoc2VjdGlvbiwgc2VjdGlvbktleSkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBzZWN0aW9uO1xuICAgIGZvciAoY29uc3QgeyBzZWN0aW9uOiBkZXBlbmRlbmN5U2VjdGlvbiwgbmFtZSwgc3BlY2lmaWVyIH0gb2Ygd29ya3NwYWNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoZGVwZW5kZW5jeVNlY3Rpb24gIT09IHNlY3Rpb25LZXkpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoXG4gICAgICAgIG5ldyBSZWdFeHAoYChcIiR7ZXNjYXBlUmVnRXhwKG5hbWUpfVwiXFxcXHMqOlxcXFxzKilcIlteXCJdKlwiYCwgJ2d1JyksXG4gICAgICAgIC8vIEEgcmVwbGFjZXIgZnVuY3Rpb24sIG5vdCBhIHJlcGxhY2VtZW50IHN0cmluZzogc3BlY2lmaWVycyBjb250YWluaW5nIGAkYCBtdXN0IGJlXG4gICAgICAgIC8vIGluc2VydGVkIGxpdGVyYWxseSBpbnN0ZWFkIG9mIGJlaW5nIGludGVycHJldGVkIGFzIHN1YnN0aXR1dGlvbiBwYXR0ZXJucy5cbiAgICAgICAgKF9tYXRjaCwgcHJlZml4OiBzdHJpbmcpID0+IGAke3ByZWZpeH0ke0pTT04uc3RyaW5naWZ5KHNwZWNpZmllcil9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbi8qKiBEZXBlbmRlbmN5IHNlY3Rpb25zIGNvbnRhaW4gb25seSBgXCJuYW1lXCI6IFwic3BlY2lmaWVyXCJgIHN0cmluZyBwYWlycywgc28gYFtee31dKmAgc3BhbnMgdGhlbS4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VJbkRlcGVuZGVuY3lTZWN0aW9ucyhcbiAgY29udGVudDogc3RyaW5nLFxuICByZXBsYWNlU2VjdGlvbjogKHNlY3Rpb246IHN0cmluZywgc2VjdGlvbktleTogc3RyaW5nKSA9PiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgLyhcIihkZXBlbmRlbmNpZXN8ZGV2RGVwZW5kZW5jaWVzfG9wdGlvbmFsRGVwZW5kZW5jaWVzfHBlZXJEZXBlbmRlbmNpZXMpXCJcXHMqOlxccypcXHspKFtee31dKikoXFx9KS9ndSxcbiAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZywgc2VjdGlvbktleTogc3RyaW5nLCBib2R5OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSA9PlxuICAgICAgYCR7cHJlZml4fSR7cmVwbGFjZVNlY3Rpb24oYm9keSwgc2VjdGlvbktleSl9JHtzdWZmaXh9YFxuICApO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkNvbnRlbnQ6IHN0cmluZ1xuKTogeyBzZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc3BlY2lmaWVyOiBzdHJpbmcgfVtdIHtcbiAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbjtcbiAgdHJ5IHtcbiAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY2llczogeyBzZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc3BlY2lmaWVyOiBzdHJpbmcgfVtdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3QpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb25ba2V5XSA/PyB7fSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh7IHNlY3Rpb246IGtleSwgbmFtZSwgc3BlY2lmaWVyOiB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1skKCkqKy4/W1xcXFxcXF1ee3x9XS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFJlbGVhc2VBcmd2LCBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBmb3J3YXJkZWRBcmdzID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldLm1hcChTdHJpbmcpO1xuICAvLyBUaGUgUEFDS0FHRSBuYW1lIChmb3IgYGJ1bnhgL2B5YXJuIGRseGAsIHdoaWNoIGZldGNoIGEgcGFja2FnZSkgYW5kIHRoZSBCSU4gbmFtZSAoZm9yIHRoZVxuICAvLyBsb2NhbCBub2RlX21vZHVsZXMvLmJpbiBsb29rdXApIGRpZmZlciBmb3IgdGhlIHNjb3BlZCBmb3JrczogYGJ1bnggbXVsdGktc2VtYW50aWMtcmVsZWFzZWBcbiAgLy8gd291bGQgZmV0Y2ggdGhlIHVucmVsYXRlZCB1bnNjb3BlZCBucG0gcGFja2FnZSBpbnN0ZWFkIG9mIGUuZy4gQGFub2xpbGFiJ3MgZm9yay5cbiAgY29uc3QgcmVsZWFzZVBhY2thZ2VOYW1lID0gKFxuICAgIFsnQGFub2xpbGFiL211bHRpLXNlbWFudGljLXJlbGVhc2UnLCAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gYXMgY29uc3RcbiAgKS5maW5kKChwYWNrYWdlTmFtZSkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0pO1xuICBjb25zdCByZWxlYXNlQmluID0gcmVsZWFzZVBhY2thZ2VOYW1lID8gJ211bHRpLXNlbWFudGljLXJlbGVhc2UnIDogJ3NlbWFudGljLXJlbGVhc2UnO1xuXG4gIC8vIFRoZSBwcm9qZWN0IGlzIGxvYWRlZCB3aXRoIGxvYWRFbnY6IGZhbHNlIChzZW1hbnRpYy1yZWxlYXNlIHJ1bnMgd2l0aCB0aGUgYW1iaWVudC9DSVxuICAvLyBlbnZpcm9ubWVudCBieSBkZXNpZ24pLCBzbyBwcm9qZWN0LmVudiBhbGlhc2VzIHByb2Nlc3MuZW52IGhlcmU7IHVzaW5nIGl0IGtlZXBzIHRoZVxuICAvLyBwcm9qZWN0LmVudiBjb252ZW50aW9uIGFuZCBwaWNrcyB1cCBlbnYgbG9hZGluZyBpZiB0aGF0IGRlc2lnbiBldmVyIGNoYW5nZXMuXG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvamVjdC5lbnYgfTtcbiAgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKHByb2plY3QuZGlyUGF0aCwgZW52KTtcbiAgY29uc3QgaGFzTG9jYWxCaW4gPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicsIHJlbGVhc2VCaW4pKTtcbiAgY29uc3QgZmFsbGJhY2tQYWNrYWdlTmFtZSA9IHJlbGVhc2VQYWNrYWdlTmFtZSA/PyAnc2VtYW50aWMtcmVsZWFzZSc7XG4gIGNvbnN0IGNvbW1hbmQgPSBoYXNMb2NhbEJpblxuICAgID8gW3JlbGVhc2VCaW4sIC4uLmZvcndhcmRlZEFyZ3NdXG4gICAgOiBwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9PT0gJ2J1bidcbiAgICAgID8gWydidW54JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICAgIDogWyd5YXJuJywgJ2RseCcsIGZhbGxiYWNrUGFja2FnZU5hbWUsIC4uLmZvcndhcmRlZEFyZ3NdO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogJHtjb21tYW5kLmpvaW4oJyAnKX1gKSk7XG4gIGlmIChhcmd2LmRyeVJ1bikgcmV0dXJuIDA7XG5cbiAgcmV0dXJuIGF3YWl0IHNwYXduQW5kV2FpdChhY3RpdmVDaGlsZCwgY29tbWFuZFswXSEsIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnYsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVzb2x2ZUZhbGxiYWNrV2JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZ2V0UnVuU2NyaXB0QXJncyB9IGZyb20gJy4uLy4uL2Jpbi9ydW5BcmdzLmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdXNlc0J1blJ1bnRpbWUgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB7IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQgfSBmcm9tICcuL2RvdGVudi5qcyc7XG5cbmV4cG9ydCBjb25zdCBydW5Db21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncnVuIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgcnVuIGEgc2NyaXB0IHdpdGggdGhlIHByb2plY3QgcnVudGltZS4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7XG4gICAgICAncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJzogZmFsc2UsXG4gICAgICAncG9wdWxhdGUtLSc6IHRydWUsXG4gICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiB0cnVlLFxuICAgIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhcmdzID0gZ2V0UnVuU2NyaXB0QXJncyhwcm9jZXNzLmFyZ3YpO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcignVXNhZ2U6IHdiIHJ1biA8c2NyaXB0PiBbYXJncy4uLl0nKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIGN3ZCk7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdD8uZW52ID8/IHJlYWRTdGFuZGFsb25lRW52aXJvbm1lbnQoYXJndiwgY3dkKTtcbiAgICBjb25zdCBjb21tYW5kID0gYnVpbGRSdW5Db21tYW5kKGN3ZCwgYXJncywgZW52LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgV291bGQgcnVuOiAke2NvbW1hbmQuam9pbignICcpfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBydW5Db21tYW5kV2l0aEVudmlyb25tZW50KGNvbW1hbmQsICd3YiBydW4gPHNjcmlwdD4gW2FyZ3MuLi5dJywge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgIH0pO1xuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGRSdW5Db21tYW5kKGN3ZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiwgcHJvamVjdD86IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGlmICghdXNlc0J1blJ1bnRpbWUoY3dkKSkgcmV0dXJuIFsnbm9kZScsIC4uLmFyZ3NdO1xuICAvLyBgYnVuIHJ1bmAgcmVzb2x2ZXMgcGFja2FnZS5qc29uIHNjcmlwdHMgYmVmb3JlIGxvY2FsIGJpbmFyaWVzLCBzbyBhIHNjcmlwdCB0aGF0IGludm9rZXNcbiAgLy8gYHdiIHJ1biA8aXRzIG93biBuYW1lPmAgKGUuZy4gXCJ2aXRlc3RcIjogXCJ3YiBydW4gdml0ZXN0IHJ1blwiKSB3b3VsZCByZXNwYXduIGl0c2VsZiBmb3JldmVyLlxuICAvLyBCeXBhc3Mgc2NyaXB0IHJlc29sdXRpb24gb25seSBmb3IgZ2VudWluZSBzZWxmLXJlY3Vyc2lvbjogdGhlIHRhcmdldCBuYW1lcyB0aGUgbGlmZWN5Y2xlXG4gIC8vIHNjcmlwdCB0aGF0IHNwYXduZWQgdGhpcyBwcm9jZXNzIEFORCB0aGUgY3VycmVudCBwYWNrYWdlIGRlY2xhcmVzIHRoYXQgdmVyeSBzY3JpcHQgdGV4dCDigJRcbiAgLy8gYSBjcm9zcy1wYWNrYWdlIGRlbGVnYXRpb24gdmlhIC0td29ya2luZy1kaXIgcmVhY2hlcyBhIGRpZmZlcmVudCBzY3JpcHQgdGV4dCwgc28gaXQgc3RpbGxcbiAgLy8gcnVucyB0aGUgZGVzdGluYXRpb24ncyBzY3JpcHQuIHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQgcHJlcGVuZHMgbm9kZV9tb2R1bGVzLy5iaW4gdG9cbiAgLy8gUEFUSCwgcmVzb2x2aW5nIHRoZSBkaXJlY3QgZXhlY3V0aW9uIHRvIHRoZSBsb2NhbCBiaW5hcnkuXG4gIGNvbnN0IHRhcmdldCA9IGFyZ3NbMF07XG4gIGlmICh0YXJnZXQgJiYgdGFyZ2V0ID09PSBlbnYubnBtX2xpZmVjeWNsZV9ldmVudCkge1xuICAgIGNvbnN0IHNjcmlwdCA9IHByb2plY3QgPyBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/Llt0YXJnZXRdIDogcmVhZFBhY2thZ2VTY3JpcHQoY3dkLCB0YXJnZXQpO1xuICAgIGlmIChzY3JpcHQgIT09IHVuZGVmaW5lZCAmJiBzY3JpcHQgPT09IGVudi5ucG1fbGlmZWN5Y2xlX3NjcmlwdCkgcmV0dXJuIFsuLi5hcmdzXTtcbiAgfVxuICByZXR1cm4gWydidW4nLCAncnVuJywgLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlU2NyaXB0KGN3ZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBgYnVuIHJ1bmAgcmVzb2x2ZXMgc2NyaXB0cyBmcm9tIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHBhY2thZ2UuanNvbiwgc28gbWF0Y2ggdGhhdCBzY29wZVxuICAvLyAoZS5nLiAtLXdvcmtpbmctZGlyIG1heSBwb2ludCB0byBhIG1hbmlmZXN0LWxlc3Mgc3ViZGlyZWN0b3J5IG9mIHRoZSByZWN1cnNpbmcgcGFja2FnZSkuXG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHBhY2thZ2VKc29uLnNjcmlwdHM/LltuYW1lXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSA9PT0gY3VycmVudFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFN0YW5kYWxvbmVFbnZpcm9ubWVudChhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UsIGN3ZDogc3RyaW5nKTogTm9kZUpTLlByb2Nlc3NFbnYge1xuICBjb25zdCBbZW52XSA9IHJlYWRBbmRNZXJnZUVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGVudi5XQl9FTlYgfHw9IHJlc29sdmVGYWxsYmFja1diRW52KGFyZ3YpO1xuICB2YWxpZGF0ZVN0YW5kYWxvbmVXYkVudihhcmd2LCBlbnYpO1xuICByZXR1cm4gZW52O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YW5kYWxvbmVXYkVudihhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UsIGVudjogTm9kZUpTLlByb2Nlc3NFbnYpOiB2b2lkIHtcbiAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG4gIGNvbnN0IHN0YW5kYXJkTW9kZXMgPSBuZXcgU2V0KFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSk7XG4gIGlmIChlbnYuV0JfRU5WICYmICFzdGFuZGFyZE1vZGVzLmhhcyhlbnYuV0JfRU5WKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgV0JfRU5WIG11c3QgYmUgb25lIG9mIGRldmVsb3BtZW50LCB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kdWN0aW9uLCBidXQgaXMgXCIke2Vudi5XQl9FTlZ9XCIuIGAgK1xuICAgICAgICAnRml4IHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3Qgc2VsZWN0ZWRDYXNjYWRlID1cbiAgICB0eXBlb2YgYXJndi5jYXNjYWRlRW52ID09PSAnc3RyaW5nJ1xuICAgICAgPyBhcmd2LmNhc2NhZGVFbnZcbiAgICAgIDogYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgICA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlXG4gICAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGVudi5XQl9FTlYgJiYgc2VsZWN0ZWRDYXNjYWRlICYmIHN0YW5kYXJkTW9kZXMuaGFzKHNlbGVjdGVkQ2FzY2FkZSkgJiYgZW52LldCX0VOViAhPT0gc2VsZWN0ZWRDYXNjYWRlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgcmVzb2x2ZXMgdG8gXCIke2Vudi5XQl9FTlZ9XCIgYWx0aG91Z2ggdGhlIFwiJHtzZWxlY3RlZENhc2NhZGV9XCIgZW52aXJvbm1lbnQgd2FzIHNlbGVjdGVkLiBgICtcbiAgICAgICAgJ0ZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIGVudiBzb3VyY2VzLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IGxvYWRlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiAoZC5uYW1lID09PSAnbWlzZS50b21sJyB8fCBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ21pc2UgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICAvLyBgbWlzZSB3aGljaCBweXRob25gIHJlc29sdmVzIHRoZSBwcm9qZWN0J3MgQUNUSVZFIGludGVycHJldGVyIHRvIGEgc2luZ2xlIGFic29sdXRlIHBhdGgsXG4gICAgICAvLyB1bmxpa2UgYG1pc2UgY3VycmVudCBweXRob25gLCB3aGljaCBwcmludHMgZXZlcnkgY29uZmlndXJlZCB2ZXJzaW9uIChtaXNlIHN1cHBvcnRzXG4gICAgICAvLyBtdWx0aS12ZXJzaW9uIHBpbnMpIGFuZCB3b3VsZCBwYXNzIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuXG4gICAgICBsZXQgcHl0aG9uUGF0aCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHl0aG9uUGF0aCA9IGNoaWxkX3Byb2Nlc3NcbiAgICAgICAgICAuZXhlY1N5bmMoJ21pc2Ugd2hpY2ggcHl0aG9uJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10gfSlcbiAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbWlzZSBtaXNzaW5nIG9yIHB5dGhvbiB1bmNvbmZpZ3VyZWQ7IGxldCBwb2V0cnkgcGljayBpdHMgZGVmYXVsdCBpbnRlcnByZXRlci5cbiAgICAgIH1cbiAgICAgIGlmIChweXRob25QYXRoKSB7XG4gICAgICAgIC8vIFRoZSBjb21tYW5kIHJ1bnMgdGhyb3VnaCBhIHNoZWxsOyBQT1NJWCBzaW5nbGUgcXVvdGVzIGtlZXAgdGhlIHBhdGggb25lIGxpdGVyYWwgYXJndW1lbnRcbiAgICAgICAgLy8gZXZlbiB3aGVuIGEgcmVsb2NhdGVkIG1pc2UgZGF0YSBkaXIgcHV0cyBtZXRhY2hhcmFjdGVycyBpbnRvIGl0LlxuICAgICAgICBjb25zdCBxdW90ZWRQeXRob25QYXRoID0gYCcke3B5dGhvblBhdGgucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3F1b3RlZFB5dGhvblBhdGh9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgJy0tJz86IHN0cmluZ1tdO1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbiAgc2lsZW50PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7ICctLSc/OiBzdHJpbmdbXSB9XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGZub3hBZ2VLZXlTZWNyZXRPcHRpb24gPSBwcm9qZWN0LmVudi5GTk9YX0FHRV9LRVlcbiAgICAgID8gJ1xcbiAgICAgICAgLS1zZWNyZXQgaWQ9Zm5veF9hZ2Vfa2V5LGVudj1GTk9YX0FHRV9LRVknXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0ke2Zub3hBZ2VLZXlTZWNyZXRPcHRpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICAvLyBObyBhZ2Uta2V5IGZvcndhcmRpbmc6IGEgcnVubmluZyBjb250YWluZXIgZ2V0cyBpdHMgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkZWNsYXJlZFxuICAgIC8vIHZhcmlhYmxlcyBmb3J3YXJkZWQgYmVsb3cgKG9yIHRoZSBwbGF0Zm9ybSdzIHN0b3JlIGluIHByb2R1Y3Rpb24pLCBhbmQgaGFuZGluZyB0aGVcbiAgICAvLyBvcmdhbml6YXRpb24td2lkZSBpZGVudGl0eSB0byBldmVyeSB0ZXN0ZWQgY29udGFpbmVyIHdvdWxkIGxldCBhbnkgYXBwbGljYXRpb24gb3JcbiAgICAvLyBkZXBlbmRlbmN5IGNvZGUgcmVhZCBpdC5cbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHtzZWxlY3RDb250YWluZXJFbnZPcHRpb25zKHByb2plY3QpfS0tcHVibGlzaCAke3Byb2plY3QuZW52LlBPUlR9OjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBkb2NrZXIgcm0gLWYgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gPiAvZGV2L251bGwgMj4mMSB8fCB0cnVlYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcblxuLy8gVmFyaWFibGVzIHRoZSBJTUFHRSBpdHNlbGYgb3duczogYSBEb2NrZXJmaWxlIHBpbnMgdGhlIGNvbnRhaW5lciBwb3J0ICh0aGUgcHVibGlzaGVkIG1hcHBpbmdcbi8vIHRhcmdldHMgODA4MCwgbm90IHRoZSBob3N0LXNpZGUgUE9SVCkgYW5kIHRoZSBydW50aW1lIG1vZGUgaXQgd2FzIGJ1aWx0IGZvciwgYW5kIGJlZm9yZSBmbm94IHRoZVxuLy8gYmFrZWQgLmVudiBmaWxlcyBsb3N0IHRvIHRob3NlIGBFTlZgIHZhbHVlcyB0b28gYmVjYXVzZSBwcm9jZXNzLmVudiB3aW5zIG92ZXIgZW52IHNvdXJjZXMuXG5jb25zdCBJTUFHRV9PV05FRF9LRVlTID0gbmV3IFNldChbJ05PREVfRU5WJywgJ1BPUlQnXSk7XG5cbi8qKlxuICogYGRvY2tlciBydW4gLS1lbnYgS0VZYCBvcHRpb25zIGZvciBldmVyeSB2YXJpYWJsZSB0aGUgcHJvamVjdCBkZWNsYXJlcywgc28gYSBjb250YWluZXIgZ2V0cyB0aGVcbiAqIGFwcCdzIGVudmlyb25tZW50LiBTaW5jZSBmbm94IHJlcGxhY2VkIHRoZSAuZW52IGZpbGVzIHRoYXQgaW1hZ2VzIHVzZWQgdG8gYmFrZSBpbiDigJQgdGhlIGFnZSBrZXlcbiAqIHRoYXQgZGVjcnlwdHMgdGhlbSBtdXN0IG5ldmVyIGVudGVyIGEgY29udGFpbmVyIOKAlCBhIGNvbnRhaW5lciB3b3VsZCBvdGhlcndpc2Ugc3RhcnQgd2l0aCBub1xuICogY29uZmlndXJhdGlvbiBhdCBhbGwuIE9ubHkgTkFNRVMgYXJlIHBhc3NlZDogZG9ja2VyIHRoZW4gZm9yd2FyZHMgZWFjaCB2YWx1ZSBmcm9tIHdiJ3Mgb3duXG4gKiBlbnZpcm9ubWVudCwga2VlcGluZyBzZWNyZXRzIG91dCBvZiB0aGUgY29tbWFuZCBsaW5lICh2aXNpYmxlIGluIGBwc2Agb3V0cHV0IGFuZCBDSSBsb2dzKS5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0Q29udGFpbmVyRW52T3B0aW9ucyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdENvbnRhaW5lckVudktleXMocHJvamVjdC5kZWNsYXJlZEVudktleXMsIHByb2plY3QuZW52KS5tYXAoKGtleSkgPT4gYC0tZW52ICR7a2V5fWApO1xuICByZXR1cm4gb3B0aW9ucy5sZW5ndGggPiAwID8gYCR7b3B0aW9ucy5qb2luKCcgJyl9IGAgOiAnJztcbn1cblxuLyoqIFRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgdG8gZm9yd2FyZCBpbnRvIGEgY29udGFpbmVyLCBzb3J0ZWQgZm9yIGEgc3RhYmxlIGNvbW1hbmQuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29udGFpbmVyRW52S2V5cyhcbiAgZGVjbGFyZWRFbnZLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+LFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD5cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5kZWNsYXJlZEVudktleXNdXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhSU1BR0VfT1dORURfS0VZUy5oYXMoa2V5KSAmJiBlbnZba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCwgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7XG4gIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoLFxuICBmaW5kV3JhbmdsZXJDb25maWdQYXRoLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG4gIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIGNvbnN0IHN0YXJ0Q29tbWFuZCA9XG4gICAgICAgIGAke2J1aWxkU2hlbGxDb21tYW5kKFsnYmFzaCcsIGN1c3RvbVN0YXJ0U2NyaXB0UGF0aF0pfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgICAgLy8gQSBzdGFydCBzY3JpcHQgZm91bmQgYXQgdGhlIG1vbm9yZXBvIHJvb3QgKGNmLiBQcm9qZWN0LmZpbmRGaWxlKSBpcyB3cml0dGVuIHRvIHJ1biBmcm9tXG4gICAgICAvLyB0aGUgcm9vdCwgbGlrZSBEb2NrZXIncyBXT1JLRElSLCBzbyBpdHMgY3dkIG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHNjcmlwdHMvLlxuICAgICAgY29uc3Qgc2NyaXB0Um9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCkpO1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBbXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBzY3JpcHRSb290RGlyUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoXG4gICAgICAgICAgPyBzdGFydENvbW1hbmRcbiAgICAgICAgICA6IGAoJHtidWlsZFNoZWxsQ29tbWFuZChbJ2NkJywgc2NyaXB0Um9vdERpclBhdGhdKX0gJiYgJHtzdGFydENvbW1hbmR9KWAsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gdGhpcy5idWlsZE1pZ3JhdGlvbkNvbW1hbmRzKHByb2plY3QpO1xuICAgIC8vIFNwbGl0dGluZyBtYXkgY3V0IHRocm91Z2ggYSBgKGNkIOKApiAmJiDigKYpYCBzdWJzaGVsbCwgYnV0IHJlam9pbmluZyB3aXRoICcgJiYgJyBhbmQgcGVyLXBpZWNlXG4gICAgLy8gcmVkaXJlY3RzIGtlZXBzIHRoZSBzY3JpcHQgdmFsaWQsIGFuZCB3Yi1nZW5lcmF0ZWQgcGF0aHMgbmV2ZXIgY29udGFpbiAnJiYnLlxuICAgIHJldHVybiBbLi4ubWlncmF0aW9uQ29tbWFuZHMuZmxhdE1hcCgoY21kKSA9PiBjbWQuc3BsaXQoJyYmJykpLCAuLi5jb21tYW5kc11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAoKGNtZCkgPT4gYCR7Y21kfSAke3RvRGV2TnVsbChhcmd2KX1gLnRyaW0oKSlcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRNaWdyYXRpb25Db21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICAgIC8vIFRlc3QtZW52aXJvbm1lbnQgd3JhbmdsZXIgc3RhdGUgaXMgZGlzcG9zYWJsZTsgd2lwZSBpdCBlbnRpcmVseSAobm90IGp1c3QgRDEpIGJlZm9yZVxuICAgIC8vIG1pZ3JhdGluZywgc2luY2Ugc3RhbGUgS1YgY2FjaGUgZW50cmllcyBvciBEdXJhYmxlIE9iamVjdCBzdG9yYWdlIGNhbiBicmVhayBlMmUgdGVzdHMuXG4gICAgY29uc3Qgd3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyA9XG4gICAgICBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpICYmIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdClcbiAgICAgICAgPyBbYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYF1cbiAgICAgICAgOiBbXTtcbiAgICAvLyBBIHByb2plY3Qgd2hvc2UgRDEgYmluZGluZ3MgY2Fycnkgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgYXBwbGllcyB0aGVtIHdpdGggd3JhbmdsZXJcbiAgICAvLyAoc2VlIFdvcmtlcnNTY3JpcHRzIC8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQpLiBSdW5uaW5nIGRyaXp6bGUta2l0IG1pZ3JhdGUgYWdhaW5zdFxuICAgIC8vIHRoZSBzYW1lIGxvY2FsIEQxIHdvdWxkIGFwcGx5IHRoZSBzYW1lIFNRTCB0d2ljZSDigJQgZHJpenpsZSdzIGdlbmVyYXRlZCBzdGF0ZW1lbnRzIGFyZSBub3RcbiAgICAvLyBpZGVtcG90ZW50IChgQ1JFQVRFIElOREVYYCB3aXRob3V0IElGIE5PVCBFWElTVFMpIOKAlCBzbyBkcml6emxlIHN0YXlzIE9STS1vbmx5IHRoZXJlLlxuICAgIGNvbnN0IG1pZ3JhdGVzRDFXaXRoV3JhbmdsZXIgPSAhIWZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBbXG4gICAgICAuLi53cmFuZ2xlclN0YXRlV2lwZUNvbW1hbmRzLFxuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlICYmICFtaWdyYXRlc0QxV2l0aFdyYW5nbGVyXG4gICAgICAgID8gW3dyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIGRyaXp6bGVTY3JpcHRzLm1pZ3JhdGVGb3JTdGFydChwcm9qZWN0KSldXG4gICAgICAgIDogW10pLFxuICAgIF07XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVEb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QpLCBvcHRpb25zKTtcbiAgfVxuICBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIEluIHRoZSB0ZXN0IGVudmlyb25tZW50IHRoZSBkZXYgc2VydmVyIHJ1bnMgYWdhaW5zdCBmcmVzaCwgZGlzcG9zYWJsZSBzdGF0ZSAoZS5nLiBhbiBlbXB0eVxuICAgIC8vIGxvY2FsIEQxKSwgc28gdGhlIHNjaGVtYSBtdXN0IGJlIG1pZ3JhdGVkIGZpcnN0IOKAlCBhbiBhcHAgd2hvc2UgcGFnZXMgcXVlcnkgdGhlIGRhdGFiYXNlXG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIGFuc3dlciA1MDAgYW5kIHRoZSBzdGFydHVwIGNoZWNrIHdvdWxkIG5ldmVyIHNlZSBhIDJ4eC5cbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgPyB0aGlzLmJ1aWxkTWlncmF0aW9uQ29tbWFuZHMocHJvamVjdCkgOiBbXTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MuXG4gICAgY29uc3Qgc3RhcnR1cENoZWNrQ29tbWFuZCA9IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ05PREVfRU5WJywgJycpfSAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBcHAocHJvamVjdCksXG4gICAgXSl9YDtcbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLCBzdGFydHVwQ2hlY2tDb21tYW5kXS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gdGhpcy5idWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIHBsYXl3cmlnaHRDb21tYW5kO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAwIC1pIDIwMDAnKX1cbiAgICAgICAgJiYgJHtidWlsZEh0dHBSZWFkaW5lc3NDb21tYW5kKHBvcnQpfVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfWAsXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSnVzdCBydW5zIFBsYXl3cmlnaHQgKHBsdXMgdGhlIG9wdGlvbmFsIGB0ZXN0L2UyZS1hZGRpdGlvbmFsYCBzY3JpcHQpLCB3aXRob3V0IGxhdW5jaGluZyB0aGUgYXBwLlxuICAgKiBVc2Ugd2hlbiBQbGF5d3JpZ2h0J3Mgb3duIGB3ZWJTZXJ2ZXJgIGNvbmZpZyBidWlsZHMgYW5kIHN0YXJ0cyB0aGUgYXBwIHVuZGVyIHRlc3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gW10sIHBsYXl3cmlnaHRBcmdzID0gWyd0ZXN0JywgJ3Rlc3QvZTJlLyddIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgJHtidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpfSR7c3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBgd2IgdGVzdGAgc2hvdWxkIGFwcGx5IHRoZSB1bml0IHJ1bm5lcidzIG91dHB1dCBoYW5kbGluZyB0byB0aGUgZTJlIHBoYXNlICh0aGUgZGVmYXVsdFxuICAgKiBwYXRoJ3MgbG9nIGRlZHVwZSB3b3VsZCBkcm9wIHJlcGVhdGVkIGZhaWx1cmUgZGV0YWlscykuIFRydWUgb25seSB3aGVuIHRoZSBlMmUgY29tbWFuZCBpcyB0aGVcbiAgICogYmFyZSB1bml0IHJ1bm5lcjogaHR0cC1zZXJ2ZXIgYW5kIFdvcmtlcnMgcHJvamVjdHMgbWF5IGFsc28gZW1pdCBpdCwgYnV0IHdyYXBwZWQgaW5cbiAgICogYHdiIGNvbmN1cnJlbnRseWAgd2l0aCBhIGxpdmUgc2VydmVyIHdob3NlIHJlcGV0aXRpdmUgbG9ncyBhcmUgd2hhdCB0aGUgZGVkdXBlIGV4aXN0cyBmb3IuXG4gICAqL1xuICB1c2VzVW5pdFJ1bm5lckZvckUyZShfOiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSA1MDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSAxMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgMjAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDIwMDAwIC1pIDQwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMCAtaSA1MDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgOTAwMDAgLWkgMTAwMDAnKX1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0KX0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGEgd2FpdC1vbiBib290IGNoZWNrIGZvciBhIGxpc3RlbmluZyBsb29wYmFjayBwb3J0LiBBIFRDUCBjaGVjayB0cmVhdHMgcmVkaXJlY3RzIGFuZFxuICogYXV0aGVudGljYXRpb24gcmVzcG9uc2VzIGFzIGEgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc2VydmVyOyBhbiBIVFRQIHN0YXR1cyBjaGVjayB3b3VsZCBrZWVwXG4gKiB3YWl0aW5nIGV2ZW4gdGhvdWdoIFBsYXl3cmlnaHQgY2FuIGFscmVhZHkgdXNlIHRoZSBhcHAuIGBsb2NhbGhvc3RgIGxldHMgTm9kZSB0cnkgYm90aCBhZGRyZXNzXG4gKiBmYW1pbGllcyB3aGVuIGEgZGV2IHNlcnZlciBiaW5kcyBvbmx5IElQdjQgb3IgSVB2Ni5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgd2FpdE9uQXJncz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgcG9ydCA9PT0gJycpIHRocm93IG5ldyBFcnJvcignUG9ydCBpcyByZXF1aXJlZCBmb3IgdGhlIGxvb3BiYWNrIHJlYWRpbmVzcyBjaGVjay4nKTtcbiAgcmV0dXJuIGB3YWl0LW9uICR7d2FpdE9uQXJncyA/IGAke3dhaXRPbkFyZ3N9IGAgOiAnJ310Y3A6bG9jYWxob3N0OiR7cG9ydH1gO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBIVFRQIHJlYWRpbmVzcyBjaGVjayB0aGF0IHJlcXVpcmVzIGFuIGFjdHVhbCByZXNwb25zZSBmcm9tIHRoZSBhcHAuIEEgVENQIGNoZWNrIGFsb25lXG4gKiBpcyBub3QgZW5vdWdoIGZvciBEb2NrZXJpemVkIHNlcnZlcnM6IGRvY2tlci1wcm94eSBhY2NlcHRzIGNvbm5lY3Rpb25zIGFzIHNvb24gYXMgdGhlIHBvcnQgaXNcbiAqIHB1Ymxpc2hlZCwgbG9uZyBiZWZvcmUgdGhlIGFwcCBpbnNpZGUgdGhlIGNvbnRhaW5lciBsaXN0ZW5zLCBzbyB0ZXN0cyB3b3VsZCBzdGFydCBhZ2FpbnN0IGEgZGVhZFxuICogYmFja2VuZCBhbmQgdGhlIHJ1biBkaWVzIGluIGEga2lsbC1vdGhlcnMgY2FzY2FkZS4gQW55IEhUVFAgc3RhdHVzIGNvdW50cyBhcyByZWFkeSAoY3VybCB3aXRob3V0XG4gKiAtZiksIHNvIHJlZGlyZWN0aW5nIG9yIGF1dGgtZ3VhcmRlZCBzZXJ2ZXJzIHN0aWxsIHBhc3Mg4oCUIHRoZSByZWFzb24gdGhlIGJvb3QgY2hlY2sgbW92ZWQgZnJvbVxuICogaHR0cC1nZXQgdG8gdGNwIGluIHRoZSBmaXJzdCBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSHR0cFJlYWRpbmVzc0NvbW1hbmQocG9ydDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBjdXJsIC1zIC1vIC9kZXYvbnVsbCAtbSA1IC0tcmV0cnkgMTUwIC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWFsbC1lcnJvcnMgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YDtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHtcbiAgQmFzZVNjcmlwdHMsXG4gIGJ1aWxkSHR0cFJlYWRpbmVzc0NvbW1hbmQsXG4gIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kLFxuICB0eXBlIFRlc3RFMkVPcHRpb25zLFxufSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAwIC1pIDIwMDAnKX0gJiYgJHtidWlsZEh0dHBSZWFkaW5lc3NDb21tYW5kKHBvcnQpfSAmJiAke3Rlc3RDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgU0VSVkVSX0xPR19GSUxFID0gJ3NlcnZlci5sb2cnO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVdpdGhvdXRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFV2l0aG91dFNlcnZlcihwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgfVxuICAvLyBBIHBsYWluIHByb2plY3QgaGFzIG5vIHNlcnZlciB0byBjb250YWluZXJpemU7IGB3YiB0ZXN0LW9uLWNpYCBtdXN0IHN0aWxsIHJ1biBldmVyeSBub24tZGVidWdcbiAgLy8gdGVzdCwgc28gdGhlIERvY2tlciBwYXRoIHJ1bnMgdGhlIHNhbWUgc3VpdGUgb24gdGhlIGhvc3QgYXMgdGhlIG5vbi1Eb2NrZXIgcGF0aC5cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVXaXRob3V0U2VydmVyKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICB9XG4gIG92ZXJyaWRlIHVzZXNVbml0UnVubmVyRm9yRTJlKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZztcbiAgfVxuXG4gIC8vIEEgbGlicmFyeSBoYXMgbm8gc2VydmVyIG9mIGl0cyBvd24sIGJ1dCBpdCBtYXkgc2hpcCBhIHNlbGYtY29udGFpbmVkIFBsYXl3cmlnaHQgZml4dHVyZSB3aG9zZVxuICAvLyBjb25maWcgYnVpbGRzIGFuZCBzdGFydHMgdGhlIGFwcCB1bmRlciB0ZXN0IHZpYSBhIGB3ZWJTZXJ2ZXJgIGJsb2NrIChlLmcuIGEgTmV4dC5qcyBmaXh0dXJlIHRoYXRcbiAgLy8gdmVyaWZpZXMgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIGltcG9ydHMgY2xlYW5seSkuIFJ1biBQbGF5d3JpZ2h0IGRpcmVjdGx5IGluIHRoYXQgY2FzZSDigJQgaW5jbHVkaW5nXG4gIC8vIG9uIENJLCB3aGVyZSBQbGF5d3JpZ2h0J3Mgb3duIGB3ZWJTZXJ2ZXJgIHN0YXJ0cyB0aGUgZml4dHVyZS4gT3RoZXJ3aXNlIHJ1biBgdGVzdC9lMmUvYCB3aXRoIHRoZVxuICAvLyB1bml0LXRlc3QgcnVubmVyOiBDTEkgYW5kIGxpYnJhcnkgcHJvamVjdHMga2VlcCBzbG93IHRlc3RzIGhpdHRpbmcgcmVhbCBleHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAgLy8gdGhlcmUsIGFuZCB3aXRob3V0IHRoaXMgcGF0aCB0aGV5IHdvdWxkIG5ldmVyIHJ1bi5cbiAgcHJpdmF0ZSBhc3luYyB0ZXN0RTJFV2l0aG91dFNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUGxheXdyaWdodE9ubHlDb21tYW5kKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBBIFBsYXl3cmlnaHQgY29uZmlnIHdpdGhvdXQgYHdlYlNlcnZlcmAgZXhwZWN0cyBhbiBleHRlcm5hbGx5IG1hbmFnZWQgc2VydmVyICh0aGUgc2hhcGUgd2JmeSdzXG4gICAgLy8gcGxheXdyaWdodENvbmZpZyBmaXhlciBkb2N1bWVudHMpOyBpdHMgc3BlY3MgY2Fubm90IHJ1biB1bmRlciB0aGUgdW5pdCBydW5uZXIuXG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICAgIH1cbiAgICAvLyBgd2IgdGVzdCAtLSA8YXJncz5gIGVuYWJsZXMgdGhlIGUyZSBwaGFzZSwgc28gZHJvcHBpbmcgdGhlIGZvcndhcmRlZCBhcmdzIGhlcmUgd291bGQgcnVuIHRoZVxuICAgIC8vIHdob2xlIChwb3RlbnRpYWxseSBwYWlkKSBzdWl0ZSB1bmZpbHRlcmVkOyB0cmFuc2xhdGUgd2hhdCB0aGUgdW5pdCBydW5uZXJzIHVuZGVyc3RhbmQuXG4gICAgY29uc3QgZm9yd2FyZGVkID0gYWRhcHRGb3J3YXJkZWRBcmdzRm9yVW5pdFJ1bm5lcihvcHRpb25zLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID8/IFtdKTtcbiAgICBpZiAoZm9yd2FyZGVkLnVuc3VwcG9ydGVkT3B0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdlY2hvJyxcbiAgICAgICAgYFNraXBwaW5nIHRlc3QvZTJlLyAoY2Fubm90IGZvcndhcmQgdGhlIFBsYXl3cmlnaHQgYXJnIHRvIHRoZSB1bml0LXRlc3QgcnVubmVyOiAke2ZvcndhcmRlZC51bnN1cHBvcnRlZE9wdGlvbn0pLmAsXG4gICAgICBdKTtcbiAgICB9XG4gICAgY29uc3QgZXhwbGljaXRUYXJnZXRzID0gWy4uLihhcmd2LnRhcmdldHMgPz8gW10pLCAuLi5mb3J3YXJkZWQudGFyZ2V0c107XG4gICAgY29uc3QgdGFyZ2V0cyA9IGV4cGxpY2l0VGFyZ2V0cy5sZW5ndGggPiAwID8gZXhwbGljaXRUYXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB1bml0UnVubmVyQ29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzIH0pO1xuICAgIHJldHVybiBmb3J3YXJkZWQuZmxhZ3MubGVuZ3RoID4gMFxuICAgICAgPyBgJHt1bml0UnVubmVyQ29tbWFuZH0gJHtidWlsZFNoZWxsQ29tbWFuZChmb3J3YXJkZWQuZmxhZ3MpfWBcbiAgICAgIDogdW5pdFJ1bm5lckNvbW1hbmQ7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcblxuY29uc3QgTkFNRV9GSUxURVJfT1BUSU9OX1JFR0VYUCA9IC9eKD86LXR8LWd8LS1ncmVwfC0tdGVzdC1uYW1lLXBhdHRlcm4pKD86PSg/PHZhbHVlPi4qKSk/JC87XG5cbi8qKlxuICogU3BsaXRzIGB3YiB0ZXN0IC0tIDxhcmdzPmAgKGRvY3VtZW50ZWQgYXMgUGxheXdyaWdodCBmbGFncykgaW50byB3aGF0IGBidW4gdGVzdGAvdml0ZXN0IGFjY2VwdDpcbiAqIGJhcmUgcGF0aHMgYmVjb21lIHBvc2l0aW9uYWwgdGFyZ2V0cywgYW5kIHRoZSBuYW1lLWZpbHRlciBmbGFncyBib3RoIHJ1bm5lcnMgc2hhcmUgYXJlIHRyYW5zbGF0ZWRcbiAqIHRvIGEgc2luZ2xlIGAtdD08cGF0dGVybj5gIHRva2VuIChgPWAtam9pbmVkIHNvIGEgcGF0dGVybiBzdGFydGluZyB3aXRoIGAtYCBpcyBub3QgcGFyc2VkIGFzIGFuXG4gKiBvcHRpb247IGxhc3QgZmlsdGVyIHdpbnMsIG1hdGNoaW5nIFBsYXl3cmlnaHQncyBDTEkpLiBBbnkgb3RoZXIgb3B0aW9uIGlzIHJlcG9ydGVkIGluc3RlYWQgb2ZcbiAqIGJlaW5nIHNwbGljZWQgaW50byB0aGUgcnVubmVyIGNvbW1hbmQg4oCUIHZpdGVzdCBhYm9ydHMgb24gdW5rbm93biBvciBkdXBsaWNhdGVkIG9wdGlvbnMsIHdoaWNoXG4gKiB3b3VsZCBraWxsIHRoZSB3aG9sZSBtb25vcmVwbyB0ZXN0IHJ1bi5cbiAqL1xuZnVuY3Rpb24gYWRhcHRGb3J3YXJkZWRBcmdzRm9yVW5pdFJ1bm5lcihhcmdzOiBzdHJpbmdbXSk6IHtcbiAgdGFyZ2V0czogc3RyaW5nW107XG4gIGZsYWdzOiBzdHJpbmdbXTtcbiAgdW5zdXBwb3J0ZWRPcHRpb24/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG5hbWVGaWx0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFyZ3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpbmRleF0gYXMgc3RyaW5nO1xuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIHRhcmdldHMucHVzaCguLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlck1hdGNoID0gTkFNRV9GSUxURVJfT1BUSU9OX1JFR0VYUC5leGVjKGFyZyk7XG4gICAgaWYgKGZpbHRlck1hdGNoKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlck1hdGNoLmdyb3Vwcz8udmFsdWUgPz8gYXJnc1srK2luZGV4XTtcbiAgICAgIC8vIEEgbWlzc2luZyBvciBlbXB0eSBmaWx0ZXIgdmFsdWUgKGUuZy4gYC0tZ3JlcCBcIiRVTlNFVF9WQVJcImApIG11c3Qgbm90IGZhbGwgdGhyb3VnaCB0byBhblxuICAgICAgLy8gdW5maWx0ZXJlZCBydW4gb2YgdGhlIHdob2xlIChwb3RlbnRpYWxseSBwYWlkKSBzdWl0ZSDigJQgYC10ICcnYCBtYXRjaGVzIGV2ZXJ5IHRlc3QuXG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm4geyB0YXJnZXRzLCBmbGFnczogW10sIHVuc3VwcG9ydGVkT3B0aW9uOiBhcmcgfTtcbiAgICAgIG5hbWVGaWx0ZXIgPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmcgIT09ICctJykge1xuICAgICAgcmV0dXJuIHsgdGFyZ2V0cywgZmxhZ3M6IFtdLCB1bnN1cHBvcnRlZE9wdGlvbjogYXJnIH07XG4gICAgfVxuICAgIHRhcmdldHMucHVzaChhcmcpO1xuICB9XG4gIHJldHVybiB7IHRhcmdldHMsIGZsYWdzOiBuYW1lRmlsdGVyID09PSB1bmRlZmluZWQgPyBbXSA6IFtgLXQ9JHtuYW1lRmlsdGVyfWBdIH07XG59XG4iLCIvLyBAb3JwYy9zZXJ2ZXIgY291bnRzOiBhbiBvUlBDIGFwcCBzZXJ2ZXMgUlBDIG92ZXIgSFRUUCwgc28gaXRzIGUyZSB0ZXN0cyBuZWVkIHRoZSBydW5uaW5nXG4vLyBzZXJ2ZXIgKGUuZy4gdGhlIERvY2tlciBjb250YWluZXIgb24gQ0kpIGp1c3QgbGlrZSB0aGUgY2xhc3NpYyBIVFRQIGZyYW1ld29ya3MuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydAb3JwYy9zZXJ2ZXInLCAnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgLy8gQmxpdHoncyB3aXRoQmxpdHogd2lyZXMgaXRzIFJQQyBsYXllciB0aHJvdWdoIGEgd2VicGFjayBsb2FkZXIsIHdoaWNoIFR1cmJvcGFjayBpZ25vcmVzLFxuICAgIC8vIHNvIEJsaXR6IGFwcHMgbXVzdCBydW4gdGhlIHdlYnBhY2sgZGV2IHNlcnZlciAoVHVyYm9wYWNrIGRpZXMgd2l0aCByZXNvbHZlIGVycm9ycykuXG4gICAgLy8gUGFzc2luZyBubyBidW5kbGVyIGZsYWcgc2VsZWN0cyB3ZWJwYWNrIG9ubHkgb24gTmV4dC5qcyAxNTsgTmV4dC5qcyAxNiBkZWZhdWx0cyB0b1xuICAgIC8vIFR1cmJvcGFjayBhbmQgbmVlZHMgYW4gZXhwbGljaXQgLS13ZWJwYWNrLCBhIGZsYWcgTmV4dC5qcyAxNSdzIENMSSByZWplY3RzIGFzIHVua25vd24uXG4gICAgbGV0IGJ1bmRsZXJPcHRpb24gPSAnLS10dXJib3BhY2sgJztcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICBidW5kbGVyT3B0aW9uID0gZ2V0TmV4dE1ham9yVmVyc2lvbihwcm9qZWN0KSA+PSAxNiA/ICctLXdlYnBhY2sgJyA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gYFlBUk4gbmV4dCBkZXYgJHtidW5kbGVyT3B0aW9ufSR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG5cbi8qKlxuICogUHJlZmVycyB0aGUgaW5zdGFsbGVkIHBhY2thZ2Ugb3ZlciB0aGUgZGVjbGFyZWQgc3BlY2lmaWVyIGJlY2F1c2UgdGhlIGRlY2xhcmVkIG9uZSBtYXkgYmUgYVxuICogcmFuZ2U7IGZhbGxzIGJhY2sgdG8gMTUgKHdlYnBhY2stYnktZGVmYXVsdCBiZWhhdmlvcikgd2hlbiBuZWl0aGVyIGlzIHJlYWRhYmxlLlxuICovXG5mdW5jdGlvbiBnZXROZXh0TWFqb3JWZXJzaW9uKHByb2plY3Q6IFByb2plY3QpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICduZXh0JywgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgICBjb25zdCBtYWpvciA9IHNlbXZlci5jb2VyY2UoaW5zdGFsbGVkLnZlcnNpb24pPy5tYWpvcjtcbiAgICBpZiAobWFqb3IgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1ham9yO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRlY2xhcmVkIHNwZWNpZmllclxuICB9XG4gIHJldHVybiBzZW12ZXIuY29lcmNlKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5uZXh0KT8ubWFqb3IgPz8gMTU7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyB2aW5leHQgKE5leHQuanMgb24gVml0ZSkgYXBwcyB0YXJnZXRpbmcgQ2xvdWRmbGFyZSBXb3JrZXJzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaW5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgLy8gVW5saWtlIGBuZXh0IGRldmAsIFZpdGUtYmFzZWQgdmluZXh0IGRvZXMgbm90IHJlYWQgdGhlIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgY29uc3QgZGV2Q29tbWFuZCA9IGBZQVJOIHZpbmV4dCBkZXYgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAvLyBUaGUgQ2xvdWRmbGFyZSB2aXRlIHBsdWdpbiAobWluaWZsYXJlKSByZWFkcyBydW50aW1lIHZhcnMgb25seSBmcm9tIGEgLmRldi52YXJzIGZpbGUsXG4gICAgLy8gc28gaXQgbXVzdCBiZSByZWdlbmVyYXRlZCBmcm9tIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIGJlZm9yZSBzZXJ2aW5nLlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBgdmluZXh0IGRldmAgKG1pbmlmbGFyZSkgc3RhcnRzIHdpdGggYW4gZW1wdHkgbG9jYWwgRDEgYW5kIGFwcGxpZXMgbm8gbWlncmF0aW9ucyBpdHNlbGY7XG4gICAgLy8gdGhlIHRlc3QgZW52aXJvbm1lbnQgd2lwZXMgaXRzIHN0YXRlIGRpcmVjdG9yeSwgc28gZXZlcnkgcGFnZSB3b3VsZCA1MDAgd2l0aG91dCB0aGlzLlxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmQgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1pZ3JhdGlvbkNvbW1hbmQpIGNvbW1hbmRzLnB1c2gobWlncmF0aW9uQ29tbWFuZCk7XG4gICAgcmV0dXJuIFsuLi5jb21tYW5kcywgZGV2Q29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIC8vIFNlcnZpbmcgdGhlIGJ1aWx0IHdvcmtlciBzdGFydHMgZnJvbSBhbiBlbXB0eSAob3Igd2lwZWQpIGxvY2FsIEQxLCBzbyB3cmFuZ2xlci1uYXRpdmVcbiAgICAvLyBtaWdyYXRpb25zIChpZiBhbnkpIG11c3QgYmUgYXBwbGllZCBmaXJzdDsgZHJpenpsZS9wcmlzbWEgbWlncmF0aW9ucyBhcmUgaGFuZGxlZCBieVxuICAgIC8vIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIC8vIGB2aW5leHQgYnVpbGRgIGVtaXRzIGEgd29ya2VyIGJ1bmRsZSBhbmQgaXRzIHdyYW5nbGVyIGNvbmZpZyB1bmRlciBkaXN0L3NlcnZlciwgc28gdGhlXG4gICAgLy8gLmRldi52YXJzIGZpbGUgZXhwb3Npbmcgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCBiZSBnZW5lcmF0ZWQgYWZ0ZXIgYnVpbGRpbmcuXG4gICAgLy8gYC0tbG9jYWwtdXBzdHJlYW1gIGtlZXBzIHJlcXVlc3QgVVJMcyBvbiB0aGUgbG9jYWwgaG9zdDsgb3RoZXJ3aXNlLCB3cmFuZ2xlciBkZXYgc2ltdWxhdGVzXG4gICAgLy8gdGhlIHByb2R1Y3Rpb24gY3VzdG9tIGRvbWFpbiBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIHJvdXRlcy5cbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICdkaXN0L3NlcnZlci8uZGV2LnZhcnMnKSxcbiAgICAgIC4uLihkMU1pZ3JhdGlvbnNDb21tYW5kID8gW2QxTWlncmF0aW9uc0NvbW1hbmRdIDogW10pLFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1jb25maWcgZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwb3J0fSAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWxvY2FsLXVwc3RyZWFtIGxvY2FsaG9zdDoke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgICksXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdmluZXh0U2NyaXB0cyA9IG5ldyBWaW5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBwbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAoZGV0ZWN0ZWQgdmlhIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyBmaWxlIHdoZW4gbm8gb3RoZXIgZnJhbWV3b3JrIG1hdGNoZXM7IHZpbmV4dCBhcHBzIGhhdmUgdGhlaXIgb3duIHNjcmlwdHMpLlxuICogRXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyBzbyB0aGF0IGUyZSB0ZXN0cyBydW4gdmlhIHRoZSB1bml0LXRlc3QgcnVubmVyIGFnYWluc3QgdGhlIHJ1bm5pbmdcbiAqIHdvcmtlciB3aGVuIHRoZSBwcm9qZWN0IGhhcyBubyBQbGF5d3JpZ2h0IGNvbmZpZy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgV29ya2Vyc1NjcmlwdHMgZXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndikuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgLy8gd3JhbmdsZXIgZGV2IGJ1bmRsZXMgdGhlIHdvcmtlciBpdHNlbGYsIHNvIG5vIHNlcGFyYXRlIGJ1aWxkIHN0ZXAgaXMgbmVlZGVkLlxuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzg3ODcnO1xuICAgIGNvbnN0IHN0YXRlRGlyID0gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpO1xuXG4gICAgLy8gVGhlc2UgaGVscGVycyByZWFkIHRoZSBkZWZhdWx0LW5hbWVkIHdyYW5nbGVyIGNvbmZpZzsgdGhhdCBpcyBzYWZlIGJlY2F1c2Ugd29ya2Vyc1NjcmlwdHNcbiAgICAvLyBpdHNlbGYgaXMgb25seSBzZWxlY3RlZCB3aGVuIHN1Y2ggYSBjb25maWcgZmlsZSBleGlzdHMgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBBcHBseSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyAoaWYgYW55KSBzbyB0aGUgbG9jYWwgZGF0YWJhc2UgbWF0Y2hlcyB0aGUgZGVwbG95ZWQgb25lLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoZDFNaWdyYXRpb25zQ29tbWFuZCkge1xuICAgICAgY29tbWFuZHMucHVzaChkMU1pZ3JhdGlvbnNDb21tYW5kKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaChcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3Byb2plY3QuZW52LlBPUlR9IC0tcGVyc2lzdC10byBcIiR7c3RhdGVEaXJ9XCIgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJzU2NyaXB0cyA9IG5ldyBXb3JrZXJzU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuL3dvcmtlcnNTY3JpcHRzLmpzJztcblxuLyoqIFBpY2tzIHRoZSBzY3JpcHRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJvamVjdCAodGhlIHNlbGVjdGlvbiBgd2IgdGVzdGAvYHdiIHRlc3Qtb24tY2lgIHNoYXJlKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBCYXNlU2NyaXB0cyB7XG4gIHJldHVybiBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3QpID8/IChkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZShwcm9qZWN0KSA/IGh0dHBTZXJ2ZXJTY3JpcHRzIDogcGxhaW5BcHBTY3JpcHRzKTtcbn1cblxuLyoqIFRoZSBmcmFtZXdvcmstZGV0ZWN0aW9uIHByZWZpeCBldmVyeSBjb25zdW1lciBzaGFyZXM7IGB3YiBzdGFydGAgY29tcG9zZXMgaXRzIG93biB0YWlsIGFyb3VuZCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBCYXNlU2NyaXB0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSByZXR1cm4gdmluZXh0U2NyaXB0cztcbiAgaWYgKGRlcHMubmV4dCkgcmV0dXJuIG5leHRTY3JpcHRzO1xuICBpZiAoZGV2RGVwcy52aXRlKSByZXR1cm4gdml0ZVNjcmlwdHM7XG4gIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHJldHVybiB3b3JrZXJzU2NyaXB0cztcbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlLCBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vc2VsZWN0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cyB8IHVuZGVmaW5lZCA9IHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdCk7XG4gICAgICBpZiAoIXNjcmlwdHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlKHByb2plY3QpIHx8XG4gICAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IHNlbGVjdFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMsIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuaW50ZXJmYWNlIFRlc3RSdW5PcHRpb25zIHtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKVxuICAgICAgLnBvc2l0aW9uYWwoJ3RhcmdldHMnLCBhcmd1bWVudHNCdWlsZGVyLnRhcmdldHMpIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHRlc3QoYXJndiBhcyBUZXN0Q29tbWFuZEFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndiwgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2KTtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKHRlc3RBcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9ICh0ZXN0QXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3QgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSB0ZXN0QXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIC8vIFJlc29sdmUgdGhlIGVudmlyb25tZW50IGVhZ2VybHk6IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgZm9yY2VzIHRoZSB0ZXN0IGNhc2NhZGUgYW5kXG4gICAgLy8gUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYgZmFsbHMgYmFjayBXQl9FTlYgdG8gdGhhdCBtb2RlIOKAlCBidXQgdGhlIGVudiBnZXR0ZXIgaXNcbiAgICAvLyBsYXp5LCBzbyBhIHByb2plY3Qgd2l0aCBubyBydW5uYWJsZSB0ZXN0cyB3b3VsZCBvdGhlcndpc2Ugc2tpcCB0aGUgdmFsaWRhdGlvbiBlbnRpcmVseS5cbiAgICB2b2lkIHByb2plY3QuZW52O1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBzY3JpcHRzID0gc2VsZWN0U2NyaXB0cyhwcm9qZWN0KTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3Qgc3RydWN0dXJlVmlvbGF0aW9ucyA9IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0KTtcbiAgICBpZiAoc3RydWN0dXJlVmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgc3RydWN0dXJlVmlvbGF0aW9ucyk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgY29uc3QgZXhwbGljaXRVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gICAgY29uc3QgdW5pdFRhcmdldHMgPSBleHBsaWNpdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIHVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIC8vIFBsYXl3cmlnaHQncyBvdXRwdXQgZGVkdXBlIChmb3Igbm9pc3kgc2VydmVyIGxvZ3MpIHdvdWxkIGRyb3AgdGhlIG5lYXItaWRlbnRpY2FsIGZhaWx1cmVcbiAgICAvLyBkZXRhaWxzIG9mIGEgdW5pdC1ydW5uZXIgc3VpdGUsIHNvIHJvdXRlIHRob3NlIHRocm91Z2ggdGhlIHVuaXQgcnVubmVyJ3Mgb3V0cHV0IGhhbmRsaW5nLlxuICAgIC8vIEEgc2tpcC1ub3RpY2UgYGVjaG9gIG11c3Qgc3RheSBvbiB0aGUgZGVmYXVsdCBwYXRoOiB0aGUgdW5pdCBydW5uZXIncyBzaWxlbnQgbW9kZSBoaWRlc1xuICAgIC8vIHN1Y2Nlc3NmdWwgb3V0cHV0IGFuZCB3b3VsZCByZXBvcnQgdGhlIHNraXBwZWQgc3VpdGUgYXMgXCJFMkUgdGVzdHMgcGFzc2VkLlwiLlxuICAgIGNvbnN0IHJ1bkUyZVRlc3RDb21tYW5kID0gKFxuICAgICAgc2NyaXB0OiBzdHJpbmcsXG4gICAgICB7IGV4aXRJZkZhaWxlZCA9IG9wdGlvbnMuZXhpdElmRmFpbGVkIH06IFRlc3RSdW5PcHRpb25zID0ge31cbiAgICApOiBQcm9taXNlPG51bWJlcj4gPT5cbiAgICAgIHNjcmlwdHMudXNlc1VuaXRSdW5uZXJGb3JFMmUocHJvamVjdCkgJiYgIXNjcmlwdC5zdGFydHNXaXRoKCdlY2hvICcpXG4gICAgICAgID8gcnVuVW5pdFRlc3RDb21tYW5kKHNjcmlwdCwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZCxcbiAgICAgICAgICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnRTJFIHRlc3RzIHBhc3NlZC4nLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogcnVuVGVzdENvbW1hbmQoc2NyaXB0LCBwcm9qZWN0LCB0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQgfSk7XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuRTJlVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuRTJlVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgcnVuRTJlVGVzdENvbW1hbmQsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIHJ1bkUyZVRlc3RDb21tYW5kLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMubmV4dCB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBbJ2NvZGVnZW4nLCBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2plY3QuZW52LlBPUlR9YF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFRlc3RDb21tYW5kQXJndiB7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYgfHwgYXJndi5jYXNjYWRlTm9kZUVudiB8fCBhcmd2LmF1dG9DYXNjYWRlRW52ID09PSBmYWxzZSkge1xuICAgIC8vIEV4cGxpY2l0IGVudiBmbGFncyBrZWVwIHRoZWlyIHByb2ZpbGUtc2VsZWN0aW9uIHNlbWFudGljcywgYnV0IHRoZSBzcGF3bmVkIHRlc3RzIG11c3Qgc3RpbGxcbiAgICAvLyBydW4gYXMgYHRlc3RgIHdoZW4gdGhlIHNlbGVjdGVkIHByb2ZpbGUgZGVmaW5lcyBubyBXQl9FTlYgKHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKS5cbiAgICByZXR1cm4geyAuLi5hcmd2LCBjb21tYW5kRGVmYXVsdFdiRW52OiAndGVzdCcgfTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuLyoqXG4gKiBVbml0IHRlc3RzIGxpdmUgb25seSB1bmRlciBgdGVzdC91bml0L2A7IGB0ZXN0L2RlYnVnL2AgcnVucyBvbmx5IHdoZW4gZXhwbGljaXRseSB0YXJnZXRlZC4gQm90aFxuICogdml0ZXN0IGFuZCBgYnVuIHRlc3RgIHRyZWF0IGEgYmFyZSBgdGVzdGAgYXMgYSBmaWxlbmFtZSBmaWx0ZXIsIHdoaWNoIGFsc28gbWF0Y2hlcyBlLmcuXG4gKiBgc3JjL2Zvby50ZXN0LnRzYCwgc28gdGhlIHRyYWlsaW5nIHNsYXNoIHRoYXQgbGltaXRzIHRoZSB0YXJnZXQgdG8gdGhlIGRpcmVjdG9yeSBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSA/IFsnLi90ZXN0L3VuaXQvJ10gOiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBydW5FMmVUZXN0Q29tbWFuZDogKHNjcmlwdDogc3RyaW5nLCBvcHRpb25zPzogVGVzdFJ1bk9wdGlvbnMpID0+IFByb21pc2U8bnVtYmVyPixcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGNvbnN0IGJ1aWxkRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKGJ1aWxkRXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gYnVpbGRFeGl0Q29kZTtcbiAgfVxuICAvLyBleGl0SWZGYWlsZWQgc3RheXMgZmFsc2Ugc28gdGhlIERvY2tlciBjb250YWluZXIgaXMgYWx3YXlzIHN0b3BwZWQgYmVsb3cuXG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1bkUyZVRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGNvbnN0IHN0b3BFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKHRlc3RFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiB0ZXN0RXhpdENvZGU7XG4gIH1cbiAgcmV0dXJuIHN0b3BFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBwcm9jZXNzU2lsZW50T3V0cHV0OiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5Vbml0VGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZHVwZU5vaXN5VGVzdE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVkdXBlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlcmF0ZUxpbmVzKG91dHB1dCkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGluZSA9IG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmUpO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZVNldC5oYXMobm9ybWFsaXplZExpbmUpKSBjb250aW51ZTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVzLnNvbWUoKHByaW50ZWRMaW5lKSA9PiBhcmVMaW5lc1NpbWlsYXIocHJpbnRlZExpbmUsIG5vcm1hbGl6ZWRMaW5lKSkpIGNvbnRpbnVlO1xuXG4gICAgcHVzaFJlY2VudFByaW50ZWRMaW5lKHJlY2VudFByaW50ZWRMaW5lcywgcmVjZW50UHJpbnRlZExpbmVTZXQsIG5vcm1hbGl6ZWRMaW5lKTtcbiAgICBkZWR1cGVkTGluZXMucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gZGVkdXBlZExpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiogaXRlcmF0ZUxpbmVzKG91dHB1dDogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBsZXQgbGluZVN0YXJ0SW5kZXggPSAwO1xuICB3aGlsZSAobGluZVN0YXJ0SW5kZXggPD0gb3V0cHV0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IG91dHB1dC5pbmRleE9mKCdcXG4nLCBsaW5lU3RhcnRJbmRleCk7XG4gICAgaWYgKGxpbmVFbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgpO1xuICAgIGxpbmVTdGFydEluZGV4ID0gbGluZUVuZEluZGV4ICsgMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoUmVjZW50UHJpbnRlZExpbmUobGluZXM6IHN0cmluZ1tdLCBsaW5lU2V0OiBTZXQ8c3RyaW5nPiwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGxpbmVzLnB1c2gobGluZSk7XG4gIGxpbmVTZXQuYWRkKGxpbmUpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlbW92ZWRMaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgaWYgKHJlbW92ZWRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBsaW5lU2V0LmRlbGV0ZShyZW1vdmVkTGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmVcbiAgICAucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlQWxsKC9eKD86XFxbW15cXF1dK1xcXVxccyopKy9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFwobm9kZTpcXGQrXFwpL2csICcobm9kZTo8bnVtYmVyPiknKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspP1o/XFxiL2csICc8dGltZXN0YW1wPicpXG4gICAgLnJlcGxhY2VBbGwoLyhbPyZdY2FjaGU9KVxcZCsvZywgJyQxPG51bWJlcj4nKTtcbn1cblxuZnVuY3Rpb24gYXJlTGluZXNTaW1pbGFyKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAoTWF0aC5hYnMoYS5sZW5ndGggLSBiLmxlbmd0aCkgPiBtYXhMZW5ndGggKiBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRpc3RhbmNlKGEsIGIpIC8gbWF4TGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU87XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKFxuICBlMmVUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIGFkZGl0aW9uYWxBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBbJ3Rlc3QnLCAuLi4oZTJlVGFyZ2V0cy5sZW5ndGggPiAwIHx8IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID8gW10gOiBbJ3Rlc3QvZTJlLyddKSwgLi4uYWRkaXRpb25hbEFyZ3NdO1xufVxuXG4vLyBNYXRjaCB0aGUgdGVzdC9lMmUgcGF0aCBzZWdtZW50LCBub3QgdGhlICcvZTJlJyBzdWJzdHJpbmc6IGEgdW5pdCB0YXJnZXQgc3VjaCBhc1xuLy8gdGVzdC91bml0L2UyZUNvbmZpZy50ZXN0LnRzIG11c3Qgbm90IGJlIGNsYXNzaWZpZWQgYXMgYW4gZTJlIHRhcmdldC5cbmNvbnN0IEUyRV9UQVJHRVRfUkVHRVhQID0gLyg/Ol58XFwvKXRlc3RcXC9lMmUoPzpcXC98JCkvO1xuXG5mdW5jdGlvbiBpc0UyZVRhcmdldCh0YXJnZXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRTJFX1RBUkdFVF9SRUdFWFAudGVzdCh0YXJnZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKFxuICB0ZXN0VGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiB7IHNob3VsZFJ1blVuaXQ6IGJvb2xlYW47IHNob3VsZFJ1bkUyZTogYm9vbGVhbiB9IHtcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gIC8vIE5vbi1lMmUgdGFyZ2V0cyAodGVzdC91bml0LyBhbmQgdGVzdC9kZWJ1Zy8pIHJ1biB0aHJvdWdoIHRoZSB1bml0LXRlc3QgcnVubmVyLlxuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gIWlzRTJlVGFyZ2V0KHRhcmdldCkpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgc2VsZWN0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zLCBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5cbmltcG9ydCB7IGdldERlZmF1bHRVbml0VGFyZ2V0cyB9IGZyb20gJy4vdGVzdC5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGF3bmVkIGNvbW1hbmRzIHJlLWRlcml2ZSB0aGVpciBlbnYgY2FzY2FkZSBmcm9tIHRoZSBleHBvcnRlZCBXQl9FTlYsIHNvIGFuIHVuZXhwb3J0ZWRcbiAgLy8gV0JfRU5WIHdvdWxkIGxldCBhIGNvbmZpZ3VyZWQgV0JfRU5WIGRlZmF1bHQgKGUuZy4gZGV2ZWxvcG1lbnQpIHNlbGVjdCB0aGUgZGV2ZWxvcG1lbnRcbiAgLy8gZW52aXJvbm1lbnQg4oCUIHJ1bm5pbmcgdGhlIGRlc3RydWN0aXZlIGUyZSBzdWl0ZSBhZ2FpbnN0IHRoZSBkZXZlbG9wZXIncyBvd24gZGF0YWJhc2UuXG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5DSSB8fD0gJzEnO1xuICAgIC8vIE92ZXJ3cml0ZSwgbm90IHx8PTogcHJvamVjdC5lbnYgYWxyZWFkeSBjYXJyaWVzIHRoZSBkb3RlbnYtZGVyaXZlZCB2YWx1ZS5cbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gc2VsZWN0U2NyaXB0cyhwcm9qZWN0KTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3Qgc3RydWN0dXJlVmlvbGF0aW9ucyA9IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0KTtcbiAgICBpZiAoc3RydWN0dXJlVmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgc3RydWN0dXJlVmlvbGF0aW9ucyk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0RvY2tlcmZpbGUgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGU7XG4gICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBkZWZhdWx0VW5pdFRhcmdldHMgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBDb25maXJtIGRldiBzZXJ2ZXIgc3RhcnR1cCBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIHByb2plY3RzIHdpdGggRTJFIHRlc3RzLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IGhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICAvLyBQcmVzZXJ2ZSBhIG5vbnplcm8gZXhpdCBjb2RlIGZyb20gYW4gZWFybGllciBwcm9qZWN0IChlLmcuIGEgbGF5b3V0IHZpb2xhdGlvbik6IGEgbGF0ZXJcbiAgICAgIC8vIHN1Y2Nlc3NmdWwgcHJvamVjdCBtdXN0IG5vdCByZXNldCB0aGUgZmFpbHVyZS5cbiAgICAgIGNvbnN0IGUyZUV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGUyZUV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBlMmVFeGl0Q29kZTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gYnVpbGRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KTtcbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgZXhpdENvZGUgb2YgZXhpdENvZGVzKSB7XG4gICAgaWYgKGV4aXRDb2RlKSBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuLyoqXG4gKiBFdmVyeSB0eXBlLWNoZWNrIGNvbW1hbmQgdGhpcyBwcm9qZWN0IHJ1bnMsIGFzIGBCVU5gL2BZQVJOYC1wcmVmaXhlZCBzY3JpcHRzLiBFeHBvcnRlZCBzb1xuICogYHdiIHZlcmlmeWAncyBzdGVwIHJlY2FwIGNhbiBuYW1lIHRoZSBzYW1lIHRvb2xzIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgdGhlIGNvbmRpdGlvbnMsIHdoaWNoXG4gKiB3b3VsZCBzaWxlbnRseSBnbyBzdGFsZSB0aGUgbmV4dCB0aW1lIHRoaXMgbGlzdCBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHByb2plY3QuaGFzT3duU291cmNlQ29kZSkge1xuICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICB9XG4gIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgncHlyaWdodCcpKSB7XG4gICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyBgdHlwZXNjcmlwdGAgKGB0c2NgKTsgd2JmeSByZW1vdmVzIHRoZVxuICAvLyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IGZyb20gbm9uLU5leHQuanMgcmVwb3MgKE5leHQuanMtZmFtaWx5XG4gIC8vIHJlcG9zIGtlZXAgaXQgZm9yIGBuZXh0IGJ1aWxkYCksIHNvIHJlcG9zIHN0aWxsIG9uIHRoZSBwcmV2aWV3IHNob3VsZCBydW4gd2JmeVxuICAvLyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB0c2dvIGZhbGxiYWNrIGhlcmUuXG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3R5cGVzY3JpcHQnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2MgLS1ub0VtaXQnXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnLi4vdXRpbHMvYnVuTG9ja2ZpbGUuanMnO1xuXG5pbXBvcnQgeyBidWlsZExpbnRDb21tYW5kLCBsaW50LCB0eXBlIExpbnRDb21tYW5kQXJndiB9IGZyb20gJy4vbGludC5qcyc7XG5pbXBvcnQgeyB0ZXN0LCB0eXBlIFRlc3RDb21tYW5kQXJndiwgd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyBidWlsZFR5cGVDaGVja0NvbW1hbmRzLCB0eXBlQ2hlY2ssIHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgfSBmcm9tICcuL3R5cGVjaGVjay5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZ1bGw6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgZGVzY3JpYmU6ICdSdW4gdGVzdHMgYWZ0ZXIgdmVyaWZ5aW5nIHByb2plY3QgY29kZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPjtcbnR5cGUgUGFja2FnZUNvbW1hbmRBcmd2ID0gUGljazxWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsICdkcnlSdW4nIHwgJ3ZlcmJvc2UnPjtcblxuLyoqIEEgY29tcGxldGVkIGB3YiB2ZXJpZnlgIHN0ZXAsIHJlY29yZGVkIHNvIHRoZSBmaW5hbCBzdW1tYXJ5IGNhbiBwcm92ZSBldmVyeSBzdGVwIGFjdHVhbGx5IHJhbi4gKi9cbmludGVyZmFjZSBWZXJpZnlTdGVwIHtcbiAgLyoqXG4gICAqIEEgc2hvcnQgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgc3RlcCByYW4sIGUuZy4gYHRzYyAtLW5vRW1pdGAuIEFnZ3JlZ2F0ZWQgYWNyb3NzIHRoZSBkZXNjZW5kYW50XG4gICAqIHByb2plY3RzLCBzbyBgICsgYCBtZWFucyBlYWNoIHRvb2wgcmFuIHNvbWV3aGVyZSwgbm90IHRoYXQgb25lIGNvbW1hbmQgcmFuIHRoZW0gYWxsLiBPbWl0dGVkIHdoZW5cbiAgICogbm90aGluZyBiZXlvbmQgdGhlIHN0ZXAgbmFtZSBkZXNjcmliZXMgaXQuXG4gICAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwczogVmVyaWZ5U3RlcFtdID0gW107XG4gICAgaWYgKGFyZ3YuZnVsbCkge1xuICAgICAgYXdhaXQgdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YsIHN0ZXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2LCBzdGVwcyk7XG4gICAgICBwcmludFZlcmlmeVN1bW1hcnkoc3RlcHMsIEJvb2xlYW4oYXJndi5kcnlSdW4pKTtcbiAgICB9XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCBzdGVwczogVmVyaWZ5U3RlcFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2LCBzdGVwcyk7XG4gICAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBuYW1lOiAndGVzdCcgfSwgKCkgPT4gcnVuUHJvamVjdFRlc3QocHJvamVjdCwgYXJndikpO1xuICAgIC8vIFByaW50ZWQgYmVmb3JlIHRoZSByZXBvcnRlciBmaW5pc2hlcyBzbyB0aGUgc3VtbWFyeSBsYW5kcyBpbiB2ZXJpZnktZnVsbC5sb2cgdG9vLlxuICAgIHByaW50VmVyaWZ5U3VtbWFyeShzdGVwcywgQm9vbGVhbihhcmd2LmRyeVJ1bikpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndiwgc3RlcHM6IFZlcmlmeVN0ZXBbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBpbnN0YWxsYDtcbiAgLy8gYGFsbG93RmFpbHVyZWAgc28gYSBmYWlsZWQgaW5zdGFsbCBzdGlsbCByZWFjaGVzIHRoZSBub3JtYWxpemF0aW9uIGJlbG93OiBidW4gcmV3cml0ZXMgdGhlXG4gIC8vIGxvY2tmaWxlIGJlZm9yZSBydW5uaW5nIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIHNjcmlwdCBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSBHdWFyZFxuICAvLyBVUkxzIGluIHRoZSB3b3JraW5nIHRyZWUuIFRoZSBmYWlsdXJlIGlzIHJlcG9ydGVkIGFuZCBleGl0cyBleGFjdGx5IGFzIHJ1blBhY2thZ2VDb21tYW5kIHdvdWxkLlxuICBjb25zdCBpbnN0YWxsRXhpdENvZGUgPSBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogaW5zdGFsbENvbW1hbmQsIG5hbWU6ICdpbnN0YWxsJyB9LCAoKSA9PlxuICAgIHJ1blBhY2thZ2VDb21tYW5kKGluc3RhbGxDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCB7IGFsbG93RmFpbHVyZTogdHJ1ZSB9KVxuICApO1xuICAvLyBUaGUgcmVwb3NpdG9yeSBtYXkgaGF2ZSBubyBgZ2VuLWNvZGVgIHNjcmlwdCAod2hlcmUgdGhlIHNhbWUgbm9ybWFsaXphdGlvbiBydW5zIGF0IHBvc3RpbnN0YWxsKSxcbiAgLy8gYW5kIGB2ZXJpZnlgIGlzIHRoZSBjb21tYW5kIGEgZGV2ZWxvcGVyIHJ1bnMgYmVmb3JlIGNvbW1pdHRpbmcuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBub3JtYWxpemVCdW5Mb2NrZmlsZShwcm9qZWN0LnJvb3REaXJQYXRoKTtcbiAgfVxuICBpZiAoaW5zdGFsbEV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2luc3RhbGxFeGl0Q29kZX0pOmApLCBpbnN0YWxsQ29tbWFuZCkpO1xuICAgIHByb2Nlc3MuZXhpdChpbnN0YWxsRXhpdENvZGUpO1xuICB9XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgIGNvbnN0IGdlbkNvZGVDb21tYW5kID0gYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGdlbi1jb2RlYDtcbiAgICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogZ2VuQ29kZUNvbW1hbmQsIG5hbWU6ICdnZW4tY29kZScgfSwgKCkgPT5cbiAgICAgIHJ1blBhY2thZ2VDb21tYW5kKGdlbkNvZGVDb21tYW5kLCBwcm9qZWN0LCBhcmd2KVxuICAgICk7XG4gIH1cbiAgLy8gUmVzb2x2ZWQgYWZ0ZXIgYGdlbi1jb2RlYCBzbyBhIGdlbmVyYXRlZCBgc3JjYCBkaXJlY3RvcnkgaXMgYWxyZWFkeSB0aGVyZSBmb3IgYGhhc1NvdXJjZUNvZGVgLFxuICAvLyB3aGljaCBpcyBhbiBleGlzdHNTeW5jIGNoZWNrLCBhbmQgcmV1c2VkIGJ5IGJvdGggc3RlcCBkZXRhaWxzIGJlbG93LiBUaGUgcHJvamVjdCBmYWN0b3JpZXNcbiAgLy8gc2hhcmUgaW5zdGFuY2VzIHBlciAoZGlyZWN0b3J5LCBsb2FkRW52LCBlbnYtcmVsZXZhbnQgYXJndiksIHNvIGB0eXBlY2hlY2tgIHJldXNlcyB0aGlzIHZlcnlcbiAgLy8gZ3JhcGggd2hpbGUgYGxpbnRgICh3aGljaCBhZGRzIC0tc2lsZW50KSByZXNvbHZlcyBpdHMgb3duLlxuICBjb25zdCBzdGVwRGV0YWlscyA9IGF3YWl0IGJ1aWxkU3RlcERldGFpbHMoYXJndik7XG4gIC8vIGBsaW50IC0tZml4IC0tZm9ybWF0YCBwcmludHMgbm90aGluZyBvbiBzdWNjZXNzLCBzbyB3aXRob3V0IHRoZSBzdGVwIHN1bW1hcnkgYSBwYXNzaW5nIGB2ZXJpZnlgXG4gIC8vIGxvb2tzIGxpa2UgaXQgbmV2ZXIgbGludGVkIGF0IGFsbCDigJQgYW5kIGl0IHNpbGVudGx5IHJld3JvdGUgdGhlIHdvcmtpbmcgdHJlZSB3aGlsZSBhdCBpdC5cbiAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IHN0ZXBEZXRhaWxzLmNsZWFudXAsIG5hbWU6ICdjbGVhbnVwJyB9LCAoKSA9PlxuICAgIHJ1bkluUHJvY2Vzc0NvbW1hbmQoJ2NsZWFudXAnLCAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndilcbiAgICApXG4gICk7XG4gIC8vIFR5cGUtYXdhcmUgbGludCByZXBvcnRzIFR5cGVTY3JpcHQgZGlhZ25vc3RpY3Mgb25seSBmb3IgdGhlIGZpbGVzIG94bGludCBhY3R1YWxseSBsaW50cywgYW5kXG4gIC8vIHRoZSBzaGFyZWQgY29uZmlnIGlnbm9yZXMgZGlyZWN0b3JpZXMgdHNjIHN0aWxsIGNvbXBpbGVzIChlLmcuIGBfX2dlbmVyYXRlZF9fYCwgYEB0eXBlc2AsXG4gIC8vIGBkaXN0YCkuIEtlZXAgdGhlIHR5cGVjaGVjayBjb21tYW5kIHNvIGB2ZXJpZnlgIHN0YXlzIGVxdWl2YWxlbnQgdG8gXCJ0aGUgcmVwb3NpdG9yeSBjb21waWxlc1wiLlxuICAvLyBUaGUgb3ZlcmxhcCB3aXRoIGxpbnQgaXMgZGVsaWJlcmF0ZTogYC0tdHlwZS1hd2FyZWAgYWxzbyBwb3dlcnMgdHlwZS1hd2FyZSBsaW50IHJ1bGVzLCBhbmRcbiAgLy8gZHJvcHBpbmcgb25seSBgLS10eXBlLWNoZWNrYCBmcm9tIGxpbnQgc2F2ZXMgfjAuMXMsIGZhciBsZXNzIHRoYW4gdGhlIGNvdmVyYWdlIGl0IHdvdWxkIGNvc3QuXG4gIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBzdGVwRGV0YWlscy50eXBlY2hlY2ssIG5hbWU6ICd0eXBlY2hlY2snIH0sICgpID0+XG4gICAgcnVuSW5Qcm9jZXNzQ29tbWFuZCgndHlwZWNoZWNrJywgKCkgPT4gdHlwZUNoZWNrKHsgLi4uYXJndiwgXzogWyd0eXBlY2hlY2snXSB9IGFzIHVua25vd24gYXMgVHlwZUNoZWNrQ29tbWFuZEFyZ3YpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KHtcbiAgICAuLi5hcmd2LFxuICAgIF86IFsndGVzdCddLFxuICAgIGUyZTogJ2hlYWRsZXNzJyxcbiAgICBzaWxlbnQ6IHRydWUsXG4gIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBkYi1yZXNldGAsIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0LCB0ZXN0QXJndiksIHRlc3RBcmd2LCB7XG4gICAgcHJpbnRSYXdPdXRwdXQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHJldHJ5RXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChyZXRyeUV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldHJ5RXhpdENvZGV9KTpgKSwgJ3Rlc3QgYWZ0ZXIgZGItcmVzZXQgcmV0cnknKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldHJ5RXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignVGVzdHMgcGFzc2VkIGFmdGVyIGRiLXJlc2V0IHJldHJ5LicpKTtcbn1cblxuZnVuY3Rpb24gZmluZFRlc3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb2plY3Qge1xuICBjb25zdCB0ZXN0UHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoIXRlc3RQcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IG5vdCBmb3VuZDogJHtwcm9qZWN0LmRpclBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHRlc3RQcm9qZWN0O1xufVxuXG4vKipcbiAqIE5hbWVzIHRoZSB0b29scyBiZWhpbmQgdGhlIGBjbGVhbnVwYCBhbmQgYHR5cGVjaGVja2Agc3RlcHMuXG4gKlxuICogQm90aCBzdGVwcyB0eXBlLWNoZWNrLCB3aGljaCByZWFkcyBhcyByZWR1bmRhbnQgdW50aWwgdGhlIHJlY2FwIHNheXMgaG93IHRoZXkgZGlmZmVyOiBgY2xlYW51cGBcbiAqIHR5cGUtY2hlY2tzIHRocm91Z2ggb3hsaW50LCB3aGljaCBzZWVzIG9ubHkgdGhlIGZpbGVzIGl0IGxpbnRzICh0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzXG4gKiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLCBgZGlzdGAsIC4uLiksIHdoaWxlIGB0eXBlY2hlY2tgIHJ1bnMgdGhlIGNvbXBpbGVyIG92ZXIgdGhlIHdob2xlXG4gKiB0c2NvbmZpZyBwcm9ncmFtLiBFdmVyeSBsYWJlbCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlc29sdmVkIHByb2plY3RzIHJhdGhlciB0aGFuIGhhcmQtY29kZWQsIHNvIGFcbiAqIHJlcG9zaXRvcnkgd2hvc2UgYGNsZWFudXBgIHJ1bnMgZmxha2U4IG9yIGBkYXJ0IGFuYWx5emVgIGlzIG5ldmVyIHRvbGQgaXQgcmFuIG94bGludC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTdGVwRGV0YWlscyhhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHsgY2xlYW51cDogc3RyaW5nOyB0eXBlY2hlY2s/OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjbGVhbnVwID0gJ2xpbnQgLS1maXggLS1mb3JtYXQnO1xuICAvLyBEZWxpYmVyYXRlbHkgcmVzb2x2ZWQgd2l0aCBubyBleHBsaWNpdCBkaXJQYXRoLCBleGFjdGx5IGFzIGBsaW50YCAobGludC50cykgYW5kIGB0eXBlQ2hlY2tgXG4gIC8vICh0eXBlY2hlY2sudHMpIHJlc29sdmUgdGhlaXJzLCBzbyB0aGUgbGFiZWxzIGFsd2F5cyBkZXNjcmliZSB0aGUgdmVyeSBwcm9qZWN0IHNldCB0aG9zZSBjb21tYW5kc1xuICAvLyBwcm9jZXNzLiBUaHJlYWRpbmcgYSBkaXJQYXRoIGluIOKAlCB0aGUgc2VsZiBwcm9qZWN0J3MsIHNheSDigJQgd291bGQgbGV0IHRoZSB0d28gZGl2ZXJnZSwgd2hpY2ggaXNcbiAgLy8gdGhlIGRyaWZ0IHRoaXMgZnVuY3Rpb24gZXhpc3RzIHRvIHByZXZlbnQuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHJldHVybiB7IGNsZWFudXAgfTtcblxuICAvLyBBc2tzIHRoZSByZWFsIGJ1aWxkZXJzIHdoYXQgdGhleSB3b3VsZCBydW4gcmF0aGVyIHRoYW4gcmVzdGF0aW5nIHRoZWlyIGNvbmRpdGlvbnMsIHNvIGEgY2hhbmdlXG4gIC8vIHRvIGVpdGhlciBjb21tYW5kIGNhbm5vdCBsZWF2ZSB0aGVzZSBsYWJlbHMgZGVzY3JpYmluZyBzb21ldGhpbmcgaXQgc3RvcHBlZCBkb2luZy4gT25seSB0aGVcbiAgLy8gcHJvamVjdCBzZWxlY3Rpb24gaXMgcmVzdGF0ZWQ6IGBsaW50YCBhbmQgYHR5cGVDaGVja2AgYXBwbHkgaXQgYXJvdW5kIHRoZWlyIGJ1aWxkZXJzLCBub3RcbiAgLy8gaW5zaWRlIHRoZW0uXG4gIGNvbnN0IHJ1bnNUeXBlQXdhcmVMaW50ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuc29tZShcbiAgICAocHJvamVjdCkgPT5cbiAgICAgIHByb2plY3QuaGFzT3duU291cmNlQ29kZSAmJiBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIHsgZml4OiB0cnVlLCBmb3JtYXQ6IHRydWUgfSk/LmluY2x1ZGVzKCctLXR5cGUtYXdhcmUnKVxuICApO1xuICBjb25zdCB0eXBlQ2hlY2tDb21tYW5kcyA9IFtcbiAgICAuLi5uZXcgU2V0KHByb2plY3RzLmRlc2NlbmRhbnRzLmZsYXRNYXAoKHByb2plY3QpID0+IGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkubWFwKHRvRGlzcGxheUNvbW1hbmQpKSksXG4gIF07XG4gIHJldHVybiB7XG4gICAgY2xlYW51cDogcnVuc1R5cGVBd2FyZUxpbnQgPyBgJHtjbGVhbnVwfSAob3hsaW50IC0tdHlwZS1hd2FyZSAtLXR5cGUtY2hlY2spYCA6IGNsZWFudXAsXG4gICAgdHlwZWNoZWNrOiB0eXBlQ2hlY2tDb21tYW5kcy5sZW5ndGggPiAwID8gdHlwZUNoZWNrQ29tbWFuZHMuam9pbignICsgJykgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKiBEcm9wcyB0aGUgcGFja2FnZS1tYW5hZ2VyIHBsYWNlaG9sZGVyIGBydW5XaXRoU3Bhd25gIGV4cGFuZHMsIGxlYXZpbmcgdGhlIHRvb2wgY2FsbCB0byBzaG93LiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5Q29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29tbWFuZC5yZXBsYWNlKC9eKD86QlVOfFlBUk4pIC91LCAnJyk7XG59XG5cbi8qKiBUaW1lcyBhIHN0ZXAgYW5kIHJlY29yZHMgaXQgZm9yIHRoZSBmaW5hbCBzdW1tYXJ5LiBTdGVwcyB0aGF0IGZhaWwgZXhpdCB0aGUgcHJvY2VzcyBpbnN0ZWFkLiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuU3RlcDxUPihcbiAgc3RlcHM6IFZlcmlmeVN0ZXBbXSxcbiAgc3RlcDogT21pdDxWZXJpZnlTdGVwLCAnZHVyYXRpb25Ncyc+LFxuICBydW46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKTtcbiAgc3RlcHMucHVzaCh7IC4uLnN0ZXAsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUnVucyBhIHN0ZXAgdGhhdCBzdWNjZWVkcyBzaWxlbnRseTogdGhlIHJlY2FwIGlzIHRoZSBzaW5nbGUgcGxhY2UgYSBzdWNjZXNzZnVsIHN0ZXAgaXMgYW5ub3VuY2VkLFxuICogc28gd3JhcHBlciBgU3RhcnRgL2BGaW5pc2hlZGAgbGluZXMgd291bGQgb25seSByZXBlYXQgaXQuIEZhaWx1cmVzIHN0aWxsIHJlcG9ydCBiZWZvcmUgZXhpdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuSW5Qcm9jZXNzQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBleGl0Q29kZSA9IChhd2FpdCBjb21tYW5kKCkpID8/IDA7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG4vKipcbiAqIFJlY2FwcyBldmVyeSBjb21wbGV0ZWQgc3RlcC5cbiAqXG4gKiBgd2IgdmVyaWZ5YCBpcyBwcmltYXJpbHkgY29uc3VtZWQgYnkgQUkgY29kaW5nIGFnZW50cywgYW5kIGl0cyBwZXItY29tbWFuZCBvdXRwdXQgaXMgdW5ldmVuOiBhXG4gKiBzdWNjZXNzZnVsIGBjbGVhbnVwYCBwcmludHMgbm90aGluZyBhdCBhbGwgd2hpbGUgYHR5cGVjaGVja2AgcHJpbnRzIHBlci1wYWNrYWdlIHByb2dyZXNzLiBSZWFkaW5nXG4gKiBhIHBhc3NpbmcgcnVuIHRoZXJlZm9yZSBnYXZlIG5vIGV2aWRlbmNlIHRoYXQgbGludGluZyBoYXBwZW5lZCwgc28gdGhlIHJlY2FwIGxpc3RzIGVhY2ggc3RlcCB0aGF0XG4gKiByYW4sIHdoYXQgaXQgcmFuLCBhbmQgaG93IGxvbmcgaXQgdG9vay5cbiAqL1xuZnVuY3Rpb24gcHJpbnRWZXJpZnlTdW1tYXJ5KHN0ZXBzOiBWZXJpZnlTdGVwW10sIGRyeVJ1bjogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoc3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgbmFtZVdpZHRoID0gTWF0aC5tYXgoLi4uc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLm5hbWUubGVuZ3RoKSk7XG4gIC8vIGAtLWRyeS1ydW5gIHNraXBzIGNvbW1hbmQgZXhlY3V0aW9uLCBzbyBldmVyeSBzdGVwIHRvb2sgbm8gdGltZSBhbmQgdmVyaWZpZWQgbm90aGluZzogYSBncmVlblxuICAvLyBcIlZlcmlmaWVkXCIgcmVjYXAgd291bGQgY2xhaW0gZXhhY3RseSB0aGUgd29yayB0aGUgZmxhZyBzdXBwcmVzc2VkLiBMaXN0IHdoYXQgd291bGQgcnVuIGluc3RlYWQuXG4gIGlmIChkcnlSdW4pIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0RyeSBydW4g4oCUIG5vdGhpbmcgd2FzIGV4ZWN1dGVkLiBTdGVwcyB0aGF0IHdvdWxkIHJ1bjonKSkpO1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgLy8gUGFkIG9ubHkgd2hlbiBhIGRldGFpbCBmb2xsb3dzLCBzbyBhIGRldGFpbC1sZXNzIHN0ZXAgZG9lcyBub3QgZW1pdCB0cmFpbGluZyB3aGl0ZXNwYWNlLlxuICAgICAgY29uc29sZS5pbmZvKGAgIC0gJHtzdGVwLmRldGFpbCA/IHN0ZXAubmFtZS5wYWRFbmQobmFtZVdpZHRoKSArIGNoYWxrLmdyYXkoYCAgJHtzdGVwLmRldGFpbH1gKSA6IHN0ZXAubmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZHVyYXRpb25zID0gc3RlcHMubWFwKChzdGVwKSA9PiBmb3JtYXRTdGVwRHVyYXRpb24oc3RlcC5kdXJhdGlvbk1zKSk7XG4gIGNvbnN0IGR1cmF0aW9uV2lkdGggPSBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkdXJhdGlvbikgPT4gZHVyYXRpb24ubGVuZ3RoKSk7XG4gIGNvbnN0IHRvdGFsRHVyYXRpb25NcyA9IHN0ZXBzLnJlZHVjZSgodG90YWwsIHN0ZXApID0+IHRvdGFsICsgc3RlcC5kdXJhdGlvbk1zLCAwKTtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZChgVmVyaWZpZWQgaW4gJHtmb3JtYXRTdGVwRHVyYXRpb24odG90YWxEdXJhdGlvbk1zKX06YCkpKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHN0ZXBdIG9mIHN0ZXBzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gKGR1cmF0aW9uc1tpbmRleF0gYXMgc3RyaW5nKS5wYWRTdGFydChkdXJhdGlvbldpZHRoKTtcbiAgICBjb25zdCBkZXRhaWwgPSBzdGVwLmRldGFpbCA/IGAgICR7c3RlcC5kZXRhaWx9YCA6ICcnO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignICDinJQgJykgKyBzdGVwLm5hbWUucGFkRW5kKG5hbWVXaWR0aCkgKyBjaGFsay5ncmF5KGAgICR7ZHVyYXRpb259JHtkZXRhaWx9YCkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blBhY2thZ2VDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhY2thZ2VDb21tYW5kQXJndixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBwcmludFJhd091dHB1dD86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcmludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdC5kaXJQYXRoKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IHByZXNlcnZlQ29sb3I6IGZhbHNlIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAncGlwZScsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBvcHRpb25zLnByaW50UmF3T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBvcHRpb25zLnByaW50UmF3T3V0cHV0LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAoIW9wdGlvbnMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQsIGV4aXRDb2RlLCByZXQuc3Rkb3V0KTtcbiAgfVxuXG4gIGlmIChleGl0Q29kZSAhPT0gMCAmJiAhb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZCkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG4vKipcbiAqIFByaW50cyBwYWNrYWdlIGNvbW1hbmQgb3V0cHV0IGZvciBgd2IgdmVyaWZ5YC5cbiAqXG4gKiBgd2IgdmVyaWZ5YCBpcyBwcmltYXJpbHkgY29uc3VtZWQgYnkgQUkgY29kaW5nIGFnZW50cywgc28gc3VjY2Vzc2Z1bCBub2lzeVxuICogY29tbWFuZHMgYXJlIHN1bW1hcml6ZWQgd2hpbGUgZmFpbHVyZSBvdXRwdXQgcmVtYWlucyBhdmFpbGFibGUgZm9yIGRpYWdub3Npcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCBUaGUgZXhlY3V0ZWQgY29tbWFuZC5cbiAqIEBwYXJhbSBleGl0Q29kZSBUaGUgY29tbWFuZCBleGl0IGNvZGUuXG4gKiBAcGFyYW0gb3V0cHV0IFRoZSBtZXJnZWQgc3Rkb3V0IGFuZCBzdGRlcnIgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gKi9cbmZ1bmN0aW9uIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDAgJiYgL14oPzpidW58eWFybikgKD86aW5zdGFsbHxnZW4tY29kZSkkL3UudGVzdChjb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0cmltbWVkT3V0cHV0ID0gb3V0cHV0LnRyaW0oKTtcbiAgaWYgKHRyaW1tZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0cmltbWVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3Q6IFByb2plY3QpOiB7XG4gIGZhaWw6IChlcnJvcj86IHVua25vd24pID0+IHZvaWQ7XG4gIGZpbmlzaDogKCkgPT4gdm9pZDtcbiAgc3VjY2VlZDogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCB3YkRpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLndiJyk7XG4gIGZzLm1rZGlyU3luYyh3YkRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHdiRGlyUGF0aCwgJ3ZlcmlmeS1mdWxsLmxvZycpO1xuICBjb25zdCBsb2dGaWxlID0gZnMub3BlblN5bmMobG9nRmlsZVBhdGgsICd3Jyk7XG4gIGNvbnN0IG9yaWdpbmFsU3Rkb3V0V3JpdGUgPSBwcm9jZXNzLnN0ZG91dC53cml0ZS5iaW5kKHByb2Nlc3Muc3Rkb3V0KTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRlcnJXcml0ZSA9IHByb2Nlc3Muc3RkZXJyLndyaXRlLmJpbmQocHJvY2Vzcy5zdGRlcnIpO1xuICBsZXQgc3VjY2VlZGVkID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRvdXRXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3RkZXJyV3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG9yaWdpbmFsV3JpdGU6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICAvLyBXcml0ZSB0byB0aGUgdGVybWluYWwgdmlhIHRoZSBvcmlnaW5hbCBzdHJlYW0gbWV0aG9kOiBhIHN5bmNocm9ub3VzIGZzLndyaXRlU3luYyBvbiB0aGVcbiAgICAvLyBzdGRvdXQvc3RkZXJyIGZkIHRocm93cyBFQUdBSU4gb24gQ0kncyBub24tYmxvY2tpbmcgcGlwZXMgd2hlbiBsYXJnZSBvdXRwdXQgZmx1c2hlcyBhdCBvbmNlLFxuICAgIC8vIHdoaWxlIHRoZSBzdHJlYW0gbWV0aG9kIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgaGFuZGxlcyBiYWNrcHJlc3N1cmUuXG4gICAgcmV0dXJuIG9yaWdpbmFsV3JpdGUoYnVmZmVyLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmdPckNhbGxiYWNrIDogY2FsbGJhY2spO1xuICB9KSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG59XG5cbi8qKiBTdWItbWludXRlIHN0ZXBzIGtlZXAgb25lIGRlY2ltYWwgc28gYSBmYXN0IHN0ZXAgaXMgbm90IGZsYXR0ZW5lZCB0byBhIG1pc2xlYWRpbmcgYDBzYC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0ZXBEdXJhdGlvbihtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtaWxsaXNlY29uZHMgPCA2MF8wMDApIHtcbiAgICByZXR1cm4gYCR7KG1pbGxpc2Vjb25kcyAvIDEwMDApLnRvRml4ZWQoMSl9c2A7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdEVsYXBzZWRUaW1lKG1pbGxpc2Vjb25kcyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVsYXBzZWRUaW1lKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGgucm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBzZWNvbmRzICUgNjA7XG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIGAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG4gIH1cbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsIHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcHJvdGVjdFJ1blNjcmlwdEFyZ3MgfSBmcm9tICcuLi9iaW4vcnVuQXJncy5qcyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjaGVja0VudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NoZWNrRW52LmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBkZXBsb3lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZG90ZW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZG90ZW52LmpzJztcbmltcG9ydCB7IGdlbkNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5Db2RlLmpzJztcbmltcG9ydCB7IGdlbkRldlZhcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5EZXZWYXJzLmpzJztcbmltcG9ydCB7IGdlbkRvY2tlckVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkRvY2tlckVudi5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmFpbHdheUVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JhaWx3YXlFbnYuanMnO1xuaW1wb3J0IHsgcmVsZWFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbGVhc2UuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHZlcmlmeUNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJpZnlDb2RlLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnByb3RlY3RSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIC8vIFdhcm4gb25seSB3aGVuIGEgc2hpbSBhY3R1YWxseSB3aW5zIGBub2RlYCByZXNvbHV0aW9uOiBvdmVuL2J1biBpbWFnZXMgYXBwZW5kIGEgaGFybWxlc3NcbiAgICAvLyAvdXNyL2xvY2FsL2J1bi1ub2RlLWZhbGxiYWNrLWJpbiAobm9kZSAtPiBidW4pIGF0IHRoZSBFTkQgb2YgUEFUSCwgc28gYSBQQVRIIHN1YnN0cmluZ1xuICAgIC8vIGNoZWNrIGZhbHNlLXBvc2l0aXZlcyB3aGVuZXZlciBhIHJlYWwgbm9kZSBwcmVjZWRlcyBpdC5cbiAgICBjb25zdCBub2RlT25QYXRoID0gZmluZEZpcnN0Tm9kZU9uUGF0aCgpO1xuICAgIGlmIChub2RlT25QYXRoICYmIGlzQnVuTm9kZVNoaW0obm9kZU9uUGF0aCkpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiBcXGBub2RlXFxgIG9uIFBBVEggaXMgYSBCdW4gc2hpbSAoJHtub2RlT25QYXRofSk7IGAgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd2Ll9bMF0gIT09ICdydW4nKSByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNoZWNrRW52Q29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChnZW5Eb2NrZXJFbnZDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmFpbHdheUVudkNvbW1hbmQpXG4gIC5jb21tYW5kKHJlbGVhc2VDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHJ1bkNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuLyoqIFRoZSBmaXJzdCBleGVjdXRhYmxlIGBub2RlYCBvbiBQQVRILCBpLmUuIHRoZSBvbmUgY2hpbGQgcHJvY2Vzc2VzIHdpbGwgcnVuLiAqL1xuZnVuY3Rpb24gZmluZEZpcnN0Tm9kZU9uUGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGRpciBvZiAocHJvY2Vzcy5lbnYuUEFUSCA/PyAnJykuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKCFkaXIpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgbm9kZVBhdGggPSBwYXRoLmpvaW4oZGlyLCAnbm9kZScpO1xuICAgIHRyeSB7XG4gICAgICBmcy5hY2Nlc3NTeW5jKG5vZGVQYXRoLCBmcy5jb25zdGFudHMuWF9PSyk7XG4gICAgICAvLyBYX09LIGFsc28gcGFzc2VzIGZvciBzZWFyY2hhYmxlIGRpcmVjdG9yaWVzLCB3aGljaCBleGVjdnAgc2tpcHMuXG4gICAgICBpZiAoZnMuc3RhdFN5bmMobm9kZVBhdGgpLmlzRmlsZSgpKSByZXR1cm4gbm9kZVBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb3QgcHJlc2VudCBvciBub3QgZXhlY3V0YWJsZSBpbiB0aGlzIGRpcmVjdG9yeTsga2VlcCBzZWFyY2hpbmcuXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVuTm9kZVNoaW0obm9kZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgYnVuIC0tYnVuYCBhbmQgYnVuZmlnJ3MgYHJ1bi5idW5gIHByZXBlbmQgYSBidW4tbm9kZS08dmVyc2lvbj4gZGlyZWN0b3J5IHdob3NlIGBub2RlYCBsaW5rc1xuICAvLyB0byBidW4sIGFuZCBvdmVuL2J1biBpbWFnZXMgc3ltbGluayBub2RlIC0+IGJ1biBpbiBidW4tbm9kZS1mYWxsYmFjay1iaW4sIHNvIHRoZSBnaXZlYXdheSBpc1xuICAvLyBlaXRoZXIgYSBidW4tbm9kZS0gcGF0aCBzZWdtZW50IG9yIGEgcmVzb2x1dGlvbiB0byB0aGUgYnVuIGJpbmFyeSBpdHNlbGYuXG4gIC8vIFNoaW1zIGxpdmUgZGlyZWN0bHkgaW4gYSBidW4tbm9kZS08dmVyc2lvbj4gZGlyZWN0b3J5LCBzbyBjaGVjayBvbmx5IHRoZSBpbW1lZGlhdGUgcGFyZW50XG4gIC8vIChyZWxhdGl2ZSBQQVRIIGVudHJpZXMgaW5jbHVkZWQpOiBtYXRjaGluZyBhbmNlc3RvcnMgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gZS5nLiBhIHJlYWwgbm9kZVxuICAvLyBpbnNpZGUgYSBidW4tbm9kZS13b3Jrc3BhY2UgY2hlY2tvdXQuXG4gIGlmIChwYXRoLmJhc2VuYW1lKHBhdGguZGlybmFtZShub2RlUGF0aCkpLnN0YXJ0c1dpdGgoJ2J1bi1ub2RlLScpKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShmcy5yZWFscGF0aFN5bmMobm9kZVBhdGgpKSA9PT0gJ2J1bic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbOSwxMCwxMSwxMiwxM10sIm1hcHBpbmdzIjoiODJCQWVBLFNBQWdCLEVBQW9DLEVBQW1DLEVBQStCLENBQ3BILE9BQU8sR0FDTCxHQUF1QyxDQUFVLENBQUMsQ0FBQyxPQUFRLEdBQ3pELEdBQStCLENBQWdCLENBQ2pELEVB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U0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUVDLEdBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsV0FBVyxXQUFXLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFLFdBQVcsV0FBVyxXQUFXLFdBQVcsTUFBTSxXQUFXLFdBQVcsRUFBRSxXQUFXLFVBQVUsQ0FBQyxFQUFFQyxHQUFFLElBQUksV0FBVyxFQUFFLEVBQUVDLEdBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRUMsR0FBRSxJQUFJLFlBQVksSUFBSSxFQUFFLElBQUksV0FBVyxJQUFJLEVBQUUsR0FBRSxJQUFJLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUUsRUFBRSxDQUFDLElBQUksRUFBRUEsR0FBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFRixHQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRUMsR0FBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssV0FBVyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBR0gsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLElBQUlBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksSUFBSUEsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEVBQUcsRUFBRyxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRSxHQUFFLEVBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUksRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFLLElBQUksSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFJLEVBQUUsR0FBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFJLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxFQUFFLEdBQUksR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUUsRUFBRSxHQUFFLEVBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsRUFBRyxJQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUcsR0FBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsRUFBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUssR0FBRyxHQUFHLEdBQUksR0FBRyxLQUFLLEdBQUcsRUFBRyxJQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLEdBQUksRUFBRSxJQUFLLEdBQUcsR0FBRyxHQUFJLEVBQUUsSUFBSyxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxFQUFHLEdBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFHLElBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRyxHQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSyxHQUFHLEdBQUcsR0FBSSxFQUFFLEtBQUssR0FBRyxFQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRyxHQUFFLEVBQUUsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEVBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUUsQ0FBQyxFQUFHLEVBQUcsR0FBRyxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRyxHQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRSxFQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUUsR0FBRSxFQUFHLENBQUMsR0FBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEdBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRSxFQUFHLENBQUMsRUFBRSxFQUFHLEdBQUUsR0FBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsRUFBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBR0MsR0FBRSxHQUFHLElBQUdBLEdBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLENDUnIySSxNQUFNLEdBQUVJLEdBQUUsRUFBRUMsR0FBRSxJQUFJLFlBQVlDLEdBQUUsSUFBSSxZQUFZLE9BQU8sRUFBRSxTQUFTRixJQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsSUFBSyxJQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsSUFBSyxLQUFJLEVBQUUsUUFBUSxJQUFLLElBQUcsRUFBRSxLQUFLLElBQUssRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsU0FBUyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSyxHQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSyxLQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsV0FBVyxLQUFLLEdBQUcsQ0FBQyxLQUFLRSxHQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBS0QsR0FBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENDQWowQixTQUFTLEdBQUUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVUUsR0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBU0MsR0FBRSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUssR0FBRSxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsT0FBTyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBU0QsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLElBQUksRUFBRUMsR0FBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFQSxHQUFFLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUssR0FBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxPQUFPLEVBQXpCLENBQTRCLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sR0FBRyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFLLEdBQUUsR0FBRyxJQUFJLElBQUssR0FBRSxDQUFDLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0NBdDhCLFNBQVNDLEdBQUUsRUFBRSxFQUFFLENBQUMsT0FBT0MsR0FBRSxHQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQWlDLFNBQVNDLElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0NBMUYsTUFBTSxFQUFFLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBSSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxHQUFFLENBQUMsY0FBYyxFQUFFLElBQUksWUFBWSxFQUFFRCxJQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sR0FBRyxPQUFPLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFB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
|