1)?d[p-2]>>this.F2:0);var A=this.FV/o,z=(1<=0){g[g.t++]=1;g.subTo(f,g)}BigInteger.ONE.dlShiftTo(p,f);f.subTo(d,d);while(d.t=0){var c=(g[--u]==b)?this.DM:Math.floor(g[u]*A+(g[u-1]+x)*z);if((g[u]+=d.am(0,c,g,s,0,p))0){g.rShiftTo(v,g)}if(a<0){BigInteger.ZERO.subTo(g,g)}}function bnMod(b){var c=nbi();this.abs().divRemTo(b,null,c);if(this.s<0&&c.compareTo(BigInteger.ZERO)>0){b.subTo(c,c)}return c}function Classic(a){this.m=a}function cConvert(a){if(a.s<0||a.compareTo(this.m)>=0){return a.mod(this.m)}else{return a}}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var a=this[0];if((a&1)==0){return 0}var b=a&3;b=(b*(2-(a&15)*b))&15;b=(b*(2-(a&255)*b))&255;b=(b*(2-(((a&65535)*b)&65535)))&65535;b=(b*(2-a*b%this.DV))%this.DV;return(b>0)?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(a.DB-15))-1;this.mt2=2*a.t}function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);if(a.s<0&&b.compareTo(BigInteger.ZERO)>0){this.m.subTo(b,b)}return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}function montReduce(a){while(a.t<=this.mt2){a[a.t++]=0}for(var c=0;c>15)*this.mpl)&this.um)<<15))&a.DM;b=c+this.m.t;a[b]+=this.m.am(0,d,a,c,0,this.m.t);while(a[b]>=a.DV){a[b]-=a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t,a);if(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(h,j){if(h>4294967295||h<1){return BigInteger.ONE}var f=nbi(),a=nbi(),d=j.convert(this),c=nbits(h)-1;d.copyTo(f);while(--c>=0){j.sqrTo(f,a);if((h&(1<0){j.mulTo(a,d,f)}else{var b=f;f=a;a=b}}return j.revert(f)}function bnModPowInt(b,a){var c;if(b<256||a.isEven()){c=new Classic(a)}else{c=new Montgomery(a)}return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0){if(this.t==1){return this[0]-this.DV}else{if(this.t==0){return -1}}}else{if(this.t==1){return this[0]}else{if(this.t==0){return 0}}}return((this[1]&((1<<(32-this.DB))-1))<>24}function bnShortValue(){return(this.t==0)?this.s:(this[0]<<16)>>16}function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){if(this.s<0){return -1}else{if(this.t<=0||(this.t==1&&this[0]<=0)){return 0}else{return 1}}}function bnpToRadix(c){if(c==null){c=10}if(this.signum()==0||c<2||c>36){return"0"}var f=this.chunkSize(c);var e=Math.pow(c,f);var i=nbv(e),j=nbi(),h=nbi(),g="";this.divRemTo(i,j,h);while(j.signum()>0){g=(e+h.intValue()).toString(c).substr(1)+g;j.divRemTo(i,j,h)}return h.intValue().toString(c)+g}function bnpFromRadix(m,h){this.fromInt(0);if(h==null){h=10}var f=this.chunkSize(h);var g=Math.pow(h,f),e=false,a=0,l=0;for(var c=0;c=f){this.dMultiply(g);this.dAddOffset(l,0);a=0;l=0}}if(a>0){this.dMultiply(Math.pow(h,a));this.dAddOffset(l,0)}if(e){BigInteger.ZERO.subTo(this,this)}}function bnpFromNumber(f,e,h){if("number"==typeof e){if(f<2){this.fromInt(1)}else{this.fromNumber(f,h);if(!this.testBit(f-1)){this.bitwiseTo(BigInteger.ONE.shiftLeft(f-1),op_or,this)}if(this.isEven()){this.dAddOffset(1,0)}while(!this.isProbablePrime(e)){this.dAddOffset(2,0);if(this.bitLength()>f){this.subTo(BigInteger.ONE.shiftLeft(f-1),this)}}}}else{var d=new Array(),g=f&7;d.length=(f>>3)+1;e.nextBytes(d);if(g>0){d[0]&=((1<0){if(e>e)!=(this.s&this.DM)>>e){c[a++]=f|(this.s<<(this.DB-e))}while(b>=0){if(e<8){f=(this[b]&((1<>(e+=this.DB-8)}else{f=(this[b]>>(e-=8))&255;if(e<=0){e+=this.DB;--b}}if((f&128)!=0){f|=-256}if(a==0&&(this.s&128)!=(f&128)){++a}if(a>0||f!=this.s){c[a++]=f}}}return c}function bnEquals(b){return(this.compareTo(b)==0)}function bnMin(b){return(this.compareTo(b)<0)?this:b}function bnMax(b){return(this.compareTo(b)>0)?this:b}function bnpBitwiseTo(c,h,e){var d,g,b=Math.min(c.t,this.t);for(d=0;d>=16;b+=16}if((a&255)==0){a>>=8;b+=8}if((a&15)==0){a>>=4;b+=4}if((a&3)==0){a>>=2;b+=2}if((a&1)==0){++b}return b}function bnGetLowestSetBit(){for(var a=0;a=this.t){return(this.s!=0)}return((this[a]&(1<<(b%this.DB)))!=0)}function bnpChangeBit(c,b){var a=BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a,b,a);return a}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}function bnpAddTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e>=this.DB}if(d.t>=this.DB}g+=this.s}else{g+=this.s;while(e>=this.DB}g+=d.s}f.s=(g<0)?-1:0;if(g>0){f[e++]=g}else{if(g<-1){f[e++]=this.DV+g}}f.t=e;f.clamp()}function bnAdd(b){var c=nbi();this.addTo(b,c);return c}function bnSubtract(b){var c=nbi();this.subTo(b,c);return c}function bnMultiply(b){var c=nbi();this.multiplyTo(b,c);return c}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(b){var c=nbi();this.divRemTo(b,c,null);return c}function bnRemainder(b){var c=nbi();this.divRemTo(b,null,c);return c}function bnDivideAndRemainder(b){var d=nbi(),c=nbi();this.divRemTo(b,d,c);return new Array(d,c)}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(b,a){if(b==0){return}while(this.t<=a){this[this.t++]=0}this[a]+=b;while(this[a]>=this.DV){this[a]-=this.DV;if(++a>=this.t){this[this.t++]=0}++this[a]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,c,b){a.multiplyTo(c,b)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp())}function bnpMultiplyLowerTo(b,f,e){var d=Math.min(this.t+b.t,f);e.s=0;e.t=d;while(d>0){e[--d]=0}var c;for(c=e.t-this.t;d=0){d[c]=0}for(c=Math.max(e-this.t,0);c2*this.m.t){return a.mod(this.m)}else{if(a.compareTo(this.m)<0){return a}else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}}function barrettRevert(a){return a}function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1){a.t=this.m.t+1;a.clamp()}this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);while(a.compareTo(this.r2)<0){a.dAddOffset(1,this.m.t+1)}a.subTo(this.r2,a);while(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Barrett.prototype.convert=barrettConvert;Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;function bnModPow(q,f){var o=q.bitLength(),h,b=nbv(1),v;if(o<=0){return b}else{if(o<18){h=1}else{if(o<48){h=3}else{if(o<144){h=4}else{if(o<768){h=5}else{h=6}}}}}if(o<8){v=new Classic(f)}else{if(f.isEven()){v=new Barrett(f)}else{v=new Montgomery(f)}}var p=new Array(),d=3,s=h-1,a=(1<1){var A=nbi();v.sqrTo(p[1],A);while(d<=a){p[d]=nbi();v.mulTo(A,p[d-2],p[d]);d+=2}}var l=q.t-1,x,u=true,c=nbi(),y;o=nbits(q[l])-1;while(l>=0){if(o>=s){x=(q[l]>>(o-s))&a}else{x=(q[l]&((1<<(o+1))-1))<<(s-o);if(l>0){x|=q[l-1]>>(this.DB+o-s)}}d=h;while((x&1)==0){x>>=1;--d}if((o-=d)<0){o+=this.DB;--l}if(u){p[x].copyTo(b);u=false}else{while(d>1){v.sqrTo(b,c);v.sqrTo(c,b);d-=2}if(d>0){v.sqrTo(b,c)}else{y=b;b=c;c=y}v.mulTo(c,p[x],b)}while(l>=0&&(q[l]&(1<0){b.rShiftTo(f,b);h.rShiftTo(f,h)}while(b.signum()>0){if((d=b.getLowestSetBit())>0){b.rShiftTo(d,b)}if((d=h.getLowestSetBit())>0){h.rShiftTo(d,h)}if(b.compareTo(h)>=0){b.subTo(h,b);b.rShiftTo(1,b)}else{h.subTo(b,h);h.rShiftTo(1,h)}}if(f>0){h.lShiftTo(f,h)}return h}function bnpModInt(e){if(e<=0){return 0}var c=this.DV%e,b=(this.s<0)?e-1:0;if(this.t>0){if(c==0){b=this[0]%e}else{for(var a=this.t-1;a>=0;--a){b=(c*b+this[a])%e}}}return b}function bnModInverse(f){var j=f.isEven();if((this.isEven()&&j)||f.signum()==0){return BigInteger.ZERO}var i=f.clone(),h=this.clone();var g=nbv(1),e=nbv(0),l=nbv(0),k=nbv(1);while(i.signum()!=0){while(i.isEven()){i.rShiftTo(1,i);if(j){if(!g.isEven()||!e.isEven()){g.addTo(this,g);e.subTo(f,e)}g.rShiftTo(1,g)}else{if(!e.isEven()){e.subTo(f,e)}}e.rShiftTo(1,e)}while(h.isEven()){h.rShiftTo(1,h);if(j){if(!l.isEven()||!k.isEven()){l.addTo(this,l);k.subTo(f,k)}l.rShiftTo(1,l)}else{if(!k.isEven()){k.subTo(f,k)}}k.rShiftTo(1,k)}if(i.compareTo(h)>=0){i.subTo(h,i);if(j){g.subTo(l,g)}e.subTo(k,e)}else{h.subTo(i,h);if(j){l.subTo(g,l)}k.subTo(e,k)}}if(h.compareTo(BigInteger.ONE)!=0){return BigInteger.ZERO}if(k.compareTo(f)>=0){return k.subtract(f)}if(k.signum()<0){k.addTo(f,k)}else{return k}if(k.signum()<0){return k.add(f)}else{return k}}var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var lplim=(1<<26)/lowprimes[lowprimes.length-1];function bnIsProbablePrime(e){var d,b=this.abs();if(b.t==1&&b[0]<=lowprimes[lowprimes.length-1]){for(d=0;d>1;if(f>lowprimes.length){f=lowprimes.length}var b=nbi();for(var e=0;e>8)&255;rng_pool[rng_pptr++]^=(a>>16)&255;rng_pool[rng_pptr++]^=(a>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(window.crypto&&window.crypto.getRandomValues){var ua=new Uint8Array(32);window.crypto.getRandomValues(ua);for(t=0;t<32;++t){rng_pool[rng_pptr++]=ua[t]}}if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr=0&&h>0){var f=e.charCodeAt(d--);if(f<128){g[--h]=f}else{if((f>127)&&(f<2048)){g[--h]=(f&63)|128;g[--h]=(f>>6)|192}else{g[--h]=(f&63)|128;g[--h]=((f>>6)&63)|128;g[--h]=(f>>12)|224}}}g[--h]=0;var b=new SecureRandom();var a=new Array();while(h>2){a[0]=0;while(a[0]==0){b.nextBytes(a)}g[--h]=a[0]}g[--h]=2;g[--h]=0;return new BigInteger(g)}function oaep_mgf1_arr(c,a,e){var b="",d=0;while(b.length>24,(d&16711680)>>16,(d&65280)>>8,d&255])));d+=1}return b}var SHA1_SIZE=20;function oaep_pad(l,a,c){if(l.length+2*SHA1_SIZE+2>a){throw"Message too long for RSA"}var h="",d;for(d=0;d0&&a.length>0){this.n=parseBigInt(b,16);this.e=parseInt(a,16)}else{alert("Invalid RSA public key")}}}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(d){var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);if(a==null){return null}var e=this.doPublic(a);if(e==null){return null}var b=e.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}function RSAEncryptOAEP(e,d){var a=oaep_pad(e,(this.n.bitLength()+7)>>3,d);if(a==null){return null}var f=this.doPublic(a);if(f==null){return null}var b=f.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;RSAKey.prototype.encryptOAEP=RSAEncryptOAEP;RSAKey.prototype.type="RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function pkcs1unpad2(g,j){var a=g.toByteArray();var f=0;while(f=a.length){return null}}var e="";while(++f191)&&(h<224)){e+=String.fromCharCode(((h&31)<<6)|(a[f+1]&63));++f}else{e+=String.fromCharCode(((h&15)<<12)|((a[f+1]&63)<<6)|(a[f+2]&63));f+=2}}}return e}function oaep_mgf1_str(c,a,e){var b="",d=0;while(b.length>24,(d&16711680)>>16,(d&65280)>>8,d&255]));d+=1}return b}var SHA1_SIZE=20;function oaep_unpad(l,b,e){l=l.toByteArray();var f;for(f=0;f0&&a.length>0){this.n=parseBigInt(c,16);this.e=parseInt(a,16);this.d=parseBigInt(b,16)}else{alert("Invalid RSA private key")}}}function RSASetPrivateEx(g,d,e,c,b,a,h,f){this.isPrivate=true;if(g==null){throw"RSASetPrivateEx N == null"}if(d==null){throw"RSASetPrivateEx E == null"}if(g.length==0){throw"RSASetPrivateEx N.length == 0"}if(d.length==0){throw"RSASetPrivateEx E.length == 0"}if(g!=null&&d!=null&&g.length>0&&d.length>0){this.n=parseBigInt(g,16);this.e=parseInt(d,16);this.d=parseBigInt(e,16);this.p=parseBigInt(c,16);this.q=parseBigInt(b,16);this.dmp1=parseBigInt(a,16);this.dmq1=parseBigInt(h,16);this.coeff=parseBigInt(f,16)}else{alert("Invalid RSA private key in RSASetPrivateEx")}}function RSAGenerate(b,i){var a=new SecureRandom();var f=b>>1;this.e=parseInt(i,16);var c=new BigInteger(i,16);for(;;){for(;;){this.p=new BigInteger(b-f,1,a);if(this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10)){break}}for(;;){this.q=new BigInteger(f,1,a);if(this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10)){break}}if(this.p.compareTo(this.q)<=0){var h=this.p;this.p=this.q;this.q=h}var g=this.p.subtract(BigInteger.ONE);var d=this.q.subtract(BigInteger.ONE);var e=g.multiply(d);if(e.gcd(c).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=c.modInverse(e);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(d);this.coeff=this.q.modInverse(this.p);break}}}function RSADoPrivate(a){if(this.p==null||this.q==null){return a.modPow(this.d,this.n)}var c=a.mod(this.p).modPow(this.dmp1,this.p);var b=a.mod(this.q).modPow(this.dmq1,this.q);while(c.compareTo(b)<0){c=c.add(this.p)}return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)}function RSADecrypt(b){var d=parseBigInt(b,16);var a=this.doPrivate(d);if(a==null){return null}return pkcs1unpad2(a,(this.n.bitLength()+7)>>3)}function RSADecryptOAEP(d,b){var e=parseBigInt(d,16);var a=this.doPrivate(e);if(a==null){return null}return oaep_unpad(a,(this.n.bitLength()+7)>>3,b)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;RSAKey.prototype.decryptOAEP=RSADecryptOAEP;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function ECFieldElementFp(b,a){this.x=a;this.q=b}function feFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.x.equals(a.x))}function feFpToBigInteger(){return this.x}function feFpNegate(){return new ECFieldElementFp(this.q,this.x.negate().mod(this.q))}function feFpAdd(a){return new ECFieldElementFp(this.q,this.x.add(a.toBigInteger()).mod(this.q))}function feFpSubtract(a){return new ECFieldElementFp(this.q,this.x.subtract(a.toBigInteger()).mod(this.q))}function feFpMultiply(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger()).mod(this.q))}function feFpSquare(){return new ECFieldElementFp(this.q,this.x.square().mod(this.q))}function feFpDivide(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))}ECFieldElementFp.prototype.equals=feFpEquals;ECFieldElementFp.prototype.toBigInteger=feFpToBigInteger;ECFieldElementFp.prototype.negate=feFpNegate;ECFieldElementFp.prototype.add=feFpAdd;ECFieldElementFp.prototype.subtract=feFpSubtract;ECFieldElementFp.prototype.multiply=feFpMultiply;ECFieldElementFp.prototype.square=feFpSquare;ECFieldElementFp.prototype.divide=feFpDivide;function ECPointFp(c,a,d,b){this.curve=c;this.x=a;this.y=d;if(b==null){this.z=BigInteger.ONE}else{this.z=b}this.zinv=null}function pointFpGetX(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpGetY(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpEquals(a){if(a==this){return true}if(this.isInfinity()){return a.isInfinity()}if(a.isInfinity()){return this.isInfinity()}var c,b;c=a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if(!c.equals(BigInteger.ZERO)){return false}b=a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO)}function pointFpIsInfinity(){if((this.x==null)&&(this.y==null)){return true}return this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)}function pointFpNegate(){return new ECPointFp(this.curve,this.x,this.y.negate(),this.z)}function pointFpAdd(l){if(this.isInfinity()){return l}if(l.isInfinity()){return this}var p=l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o=l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(o)){if(BigInteger.ZERO.equals(p)){return this.twice()}return this.curve.getInfinity()}var j=new BigInteger("3");var e=this.x.toBigInteger();var n=this.y.toBigInteger();var c=l.x.toBigInteger();var k=l.y.toBigInteger();var m=o.square();var i=m.multiply(o);var d=e.multiply(m);var g=p.square().multiply(this.z);var a=g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h=d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f=i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(a),this.curve.fromBigInteger(h),f)}function pointFpTwice(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var g=new BigInteger("3");var c=this.x.toBigInteger();var h=this.y.toBigInteger();var e=h.multiply(this.z);var j=e.multiply(h).mod(this.curve.q);var i=this.curve.a.toBigInteger();var k=c.square().multiply(g);if(!BigInteger.ZERO.equals(i)){k=k.add(this.z.square().multiply(i))}k=k.mod(this.curve.q);var b=k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f=k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d=e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(b),this.curve.fromBigInteger(f),d)}function pointFpMultiply(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add(a?this:l)}}return d}function pointFpMultiplyTwo(c,a,b){var d;if(c.bitLength()>b.bitLength()){d=c.bitLength()-1}else{d=b.bitLength()-1}var f=this.curve.getInfinity();var e=this.add(a);while(d>=0){f=f.twice();if(c.testBit(d)){if(b.testBit(d)){f=f.add(e)}else{f=f.add(this)}}else{if(b.testBit(d)){f=f.add(a)}}--d}return f}ECPointFp.prototype.getX=pointFpGetX;ECPointFp.prototype.getY=pointFpGetY;ECPointFp.prototype.equals=pointFpEquals;ECPointFp.prototype.isInfinity=pointFpIsInfinity;ECPointFp.prototype.negate=pointFpNegate;ECPointFp.prototype.add=pointFpAdd;ECPointFp.prototype.twice=pointFpTwice;ECPointFp.prototype.multiply=pointFpMultiply;ECPointFp.prototype.multiplyTwo=pointFpMultiplyTwo;function ECCurveFp(e,d,c){this.q=e;this.a=this.fromBigInteger(d);this.b=this.fromBigInteger(c);this.infinity=new ECPointFp(this,null,null)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.a.equals(a.a)&&this.b.equals(a.b))}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(a){return new ECFieldElementFp(this.q,a)}function curveFpDecodePointHex(d){switch(parseInt(d.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var a=(d.length-2)/2;var c=d.substr(2,a);var b=d.substr(a+2,a);return new ECPointFp(this,this.fromBigInteger(new BigInteger(c,16)),this.fromBigInteger(new BigInteger(b,16)));default:return null}}ECCurveFp.prototype.getQ=curveFpGetQ;ECCurveFp.prototype.getA=curveFpGetA;ECCurveFp.prototype.getB=curveFpGetB;ECCurveFp.prototype.equals=curveFpEquals;ECCurveFp.prototype.getInfinity=curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger=curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex=curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
*/
ECFieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)};ECPointFp.prototype.getEncoded=function(c){var d=function(h,f){var g=h.toByteArrayUnsigned();if(fg.length){g.unshift(0)}}return g};var a=this.getX().toBigInteger();var e=this.getY().toBigInteger();var b=d(a,32);if(c){if(e.isEven()){b.unshift(2)}else{b.unshift(3)}}else{b.unshift(4);b=b.concat(d(e,32))}return b};ECPointFp.decodeFrom=function(g,c){var f=c[0];var e=c.length-1;var d=c.slice(1,1+e/2);var b=c.slice(1+e/2,1+e);d.unshift(0);b.unshift(0);var a=new BigInteger(d);var h=new BigInteger(b);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.decodeFromHex=function(g,c){var f=c.substr(0,2);var e=c.length-2;var d=c.substr(2,e/2);var b=c.substr(2+e/2,e/2);var a=new BigInteger(d,16);var h=new BigInteger(b,16);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.prototype.add2D=function(c){if(this.isInfinity()){return c}if(c.isInfinity()){return this}if(this.x.equals(c.x)){if(this.y.equals(c.y)){return this.twice()}return this.curve.getInfinity()}var g=c.x.subtract(this.x);var e=c.y.subtract(this.y);var a=e.divide(g);var d=a.square().subtract(this.x).subtract(c.x);var f=a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve,d,f)};ECPointFp.prototype.twice2D=function(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var b=this.curve.fromBigInteger(BigInteger.valueOf(2));var e=this.curve.fromBigInteger(BigInteger.valueOf(3));var a=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c=a.square().subtract(this.x.multiply(b));var d=a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve,c,d)};ECPointFp.prototype.multiply2D=function(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add2D(a?this:l)}}return d};ECPointFp.prototype.isOnCurve=function(){var d=this.getX().toBigInteger();var i=this.getY().toBigInteger();var f=this.curve.getA().toBigInteger();var c=this.curve.getB().toBigInteger();var h=this.curve.getQ();var e=i.multiply(i).mod(h);var g=d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g)};ECPointFp.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"};ECPointFp.prototype.validate=function(){var c=this.curve.getQ();if(this.isInfinity()){throw new Error("Point is at infinity.")}var a=this.getX().toBigInteger();var b=this.getY().toBigInteger();if(a.compareTo(BigInteger.ONE)<0||a.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("x coordinate out of bounds")}if(b.compareTo(BigInteger.ONE)<0||b.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("y coordinate out of bounds")}if(!this.isOnCurve()){throw new Error("Point is not on the curve.")}if(this.multiply(c).isInfinity()){throw new Error("Point is not a scalar multiple of G.")}return true};
/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval
*/
var jsonParse=(function(){var e="(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";var j='(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';var i='(?:"'+j+'*")';var d=new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|"+e+"|"+i+")","g");var k=new RegExp("\\\\(?:([^u])|u(.{4}))","g");var g={'"':'"',"/":"/","\\":"\\",b:"\b",f:"\f",n:"\n",r:"\r",t:"\t"};function h(l,m,n){return m?g[m]:String.fromCharCode(parseInt(n,16))}var c=new String("");var a="\\";var f={"{":Object,"[":Array};var b=Object.hasOwnProperty;return function(u,q){var p=u.match(d);var x;var v=p[0];var l=false;if("{"===v){x={}}else{if("["===v){x=[]}else{x=[];l=true}}var t;var r=[x];for(var o=1-l,m=p.length;o=0;){delete D[n[A]]}}}return q.call(C,B,D)};x=s({"":x},"")}return x}})();
/*! asn1-1.0.9.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}KJUR.asn1.ASN1Util=new function(){this.integerToByteHex=function(a){var b=a.toString(16);if((b.length%2)==1){b="0"+b}return b};this.bigIntToMinTwosComplementsHex=function(j){var f=j.toString(16);if(f.substr(0,1)!="-"){if(f.length%2==1){f="0"+f}else{if(!f.match(/^[0-7]/)){f="00"+f}}}else{var a=f.substr(1);var e=a.length;if(e%2==1){e+=1}else{if(!f.match(/^[0-7]/)){e+=2}}var g="";for(var d=0;d15){throw"ASN.1 length too long to represent by 8x: n = "+i.toString(16)}var f=128+g;return f.toString(16)+h}};this.getEncodedHex=function(){if(this.hTLV==null||this.isModified){this.hV=this.getFreshValueHex();this.hL=this.getLengthHexFromValue();this.hTLV=this.hT+this.hL+this.hV;this.isModified=false}return this.hTLV};this.getValueHex=function(){this.getEncodedHex();return this.hV};this.getFreshValueHex=function(){return""}};KJUR.asn1.DERAbstractString=function(c){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b=null;var a=null;this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(this.s)};this.setStringHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"){this.setString(c)}else{if(typeof c.str!="undefined"){this.setString(c.str)}else{if(typeof c.hex!="undefined"){this.setStringHex(c.hex)}}}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractString,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime=function(c){KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b=null;var a=null;this.localDateToUTC=function(f){utc=f.getTime()+(f.getTimezoneOffset()*60000);var e=new Date(utc);return e};this.formatDate=function(m,o,e){var g=this.zeroPadding;var n=this.localDateToUTC(m);var p=String(n.getFullYear());if(o=="utc"){p=p.substr(2,2)}var l=g(String(n.getMonth()+1),2);var q=g(String(n.getDate()),2);var h=g(String(n.getHours()),2);var i=g(String(n.getMinutes()),2);var j=g(String(n.getSeconds()),2);var r=p+l+q+h+i+j;if(e===true){var f=n.getMilliseconds();if(f!=0){var k=g(String(f),3);k=k.replace(/[0]+$/,"");r=r+"."+k}}return r+"Z"};this.zeroPadding=function(e,d){if(e.length>=d){return e}return new Array(d-e.length+1).join("0")+e};this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(d)};this.setByDateValue=function(h,j,e,d,f,g){var i=new Date(Date.UTC(h,j-1,e,d,f,g,0));this.setByDate(i)};this.getFreshValueHex=function(){return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERAbstractTime,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured=function(b){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a=null;this.setByASN1ObjectArray=function(c){this.hTLV=null;this.isModified=true;this.asn1Array=c};this.appendASN1Object=function(c){this.hTLV=null;this.isModified=true;this.asn1Array.push(c)};this.asn1Array=new Array();if(typeof b!="undefined"){if(typeof b.array!="undefined"){this.asn1Array=b.array}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured,KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean=function(){KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT="01";this.hTLV="0101ff"};YAHOO.lang.extend(KJUR.asn1.DERBoolean,KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger=function(a){KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT="02";this.setByBigInteger=function(b){this.hTLV=null;this.isModified=true;this.hV=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)};this.setByInteger=function(c){var b=new BigInteger(String(c),10);this.setByBigInteger(b)};this.setValueHex=function(b){this.hV=b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.bigint!="undefined"){this.setByBigInteger(a.bigint)}else{if(typeof a["int"]!="undefined"){this.setByInteger(a["int"])}else{if(typeof a=="number"){this.setByInteger(a)}else{if(typeof a.hex!="undefined"){this.setValueHex(a.hex)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERInteger,KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString=function(a){KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT="03";this.setHexValueIncludingUnusedBits=function(b){this.hTLV=null;this.isModified=true;this.hV=b};this.setUnusedBitsAndHexValue=function(b,d){if(b<0||7=(b*2))){break}if(d>=200){break}c.push(e);g=e;d++}return c};this.getNthChildIndex_AtObj=function(d,b,e){var c=this.getPosArrayOfChildren_AtObj(d,b);return c[e]};this.getDecendantIndexByNthList=function(e,d,c){if(c.length==0){return d}var f=c.shift();var b=this.getPosArrayOfChildren_AtObj(e,d);return this.getDecendantIndexByNthList(e,b[f],c)};this.getDecendantHexTLVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfTLV_AtObj(d,a)};this.getDecendantHexVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfV_AtObj(d,a)}};ASN1HEX.getVbyList=function(d,c,b,e){var a=this.getDecendantIndexByNthList(d,c,b);if(a===undefined){throw"can't find nthList object"}if(e!==undefined){if(d.substr(a,2)!=e){throw"checking tag doesn't match: "+d.substr(a,2)+"!="+e}}return this.getHexOfV_AtObj(d,a)};ASN1HEX.hextooidstr=function(e){var h=function(b,a){if(b.length>=a){return b}return new Array(a-b.length+1).join("0")+b};var l=[];var o=e.substr(0,2);var f=parseInt(o,16);l[0]=new String(Math.floor(f/40));l[1]=new String(f%40);var m=e.substr(2);var k=[];for(var g=0;g0){n=n+"."+j.join(".")}return n};ASN1HEX.dump=function(e,c,k,g){var o=function(w,i){if(w.length<=i*2){return w}else{var v=w.substr(0,i)+"..(total "+w.length/2+"bytes).."+w.substr(w.length-i,i);return v}};if(c===undefined){c={ommit_long_octet:32}}if(k===undefined){k=0}if(g===undefined){g=""}var r=c.ommit_long_octet;if(e.substr(k,2)=="01"){var h=ASN1HEX.getHexOfV_AtObj(e,k);if(h=="00"){return g+"BOOLEAN FALSE\n"}else{return g+"BOOLEAN TRUE\n"}}if(e.substr(k,2)=="02"){var h=ASN1HEX.getHexOfV_AtObj(e,k);return g+"INTEGER "+o(h,r)+"\n"}if(e.substr(k,2)=="03"){var h=ASN1HEX.getHexOfV_AtObj(e,k);return g+"BITSTRING "+o(h,r)+"\n"}if(e.substr(k,2)=="04"){var h=ASN1HEX.getHexOfV_AtObj(e,k);if(ASN1HEX.isASN1HEX(h)){var j=g+"OCTETSTRING, encapsulates\n";j=j+ASN1HEX.dump(h,c,0,g+" ");return j}else{return g+"OCTETSTRING "+o(h,r)+"\n"}}if(e.substr(k,2)=="05"){return g+"NULL\n"}if(e.substr(k,2)=="06"){var l=ASN1HEX.getHexOfV_AtObj(e,k);var a=KJUR.asn1.ASN1Util.oidHexToInt(l);var n=KJUR.asn1.x509.OID.oid2name(a);var b=a.replace(/\./g," ");if(n!=""){return g+"ObjectIdentifier "+n+" ("+b+")\n"}else{return g+"ObjectIdentifier ("+b+")\n"}}if(e.substr(k,2)=="0c"){return g+"UTF8String '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="13"){return g+"PrintableString '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="14"){return g+"TeletexString '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="16"){return g+"IA5String '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="17"){return g+"UTCTime "+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"\n"}if(e.substr(k,2)=="18"){return g+"GeneralizedTime "+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"\n"}if(e.substr(k,2)=="30"){if(e.substr(k,4)=="3000"){return g+"SEQUENCE {}\n"}var j=g+"SEQUENCE\n";var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,k);var f=c;if((d.length==2||d.length==3)&&e.substr(d[0],2)=="06"&&e.substr(d[d.length-1],2)=="04"){var t=ASN1HEX.getHexOfV_AtObj(e,d[0]);var a=KJUR.asn1.ASN1Util.oidHexToInt(t);var n=KJUR.asn1.x509.OID.oid2name(a);var p=JSON.parse(JSON.stringify(c));p.x509ExtName=n;f=p}for(var q=0;q0){var d=new KJUR.asn1.DERSequence({array:this.extensionsArray});var b=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a3",obj:d});this.asn1Array.push(b)}var e=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=e.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Extension=function(b){KJUR.asn1.x509.Extension.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var f=new KJUR.asn1.DERObjectIdentifier({oid:this.oid});var e=new KJUR.asn1.DEROctetString({hex:this.getExtnValueHex()});var d=new Array();d.push(f);if(this.critical){d.push(new KJUR.asn1.DERBoolean())}d.push(e);var c=new KJUR.asn1.DERSequence({array:d});return c.getEncodedHex()};this.critical=false;if(typeof b!="undefined"){if(typeof b.critical!="undefined"){this.critical=b.critical}}};YAHOO.lang.extend(KJUR.asn1.x509.Extension,KJUR.asn1.ASN1Object);KJUR.asn1.x509.KeyUsage=function(a){KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.15";if(typeof a!="undefined"){if(typeof a.bin!="undefined"){this.asn1ExtnValue=new KJUR.asn1.DERBitString(a)}}};YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.BasicConstraints=function(c){KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this,c);var a=false;var b=-1;this.getExtnValueHex=function(){var e=new Array();if(this.cA){e.push(new KJUR.asn1.DERBoolean())}if(this.pathLen>-1){e.push(new KJUR.asn1.DERInteger({"int":this.pathLen}))}var d=new KJUR.asn1.DERSequence({array:e});this.asn1ExtnValue=d;return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.19";this.cA=false;this.pathLen=-1;if(typeof c!="undefined"){if(typeof c.cA!="undefined"){this.cA=c.cA}if(typeof c.pathLen!="undefined"){this.pathLen=c.pathLen}}};YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRLDistributionPoints=function(a){KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.setByDPArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence({array:b})};this.setByOneURI=function(e){var b=new KJUR.asn1.x509.GeneralNames([{uri:e}]);var d=new KJUR.asn1.x509.DistributionPointName(b);var c=new KJUR.asn1.x509.DistributionPoint({dpobj:d});this.setByDPArray([c])};this.oid="2.5.29.31";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setByDPArray(a.array)}else{if(typeof a.uri!="undefined"){this.setByOneURI(a.uri)}}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.ExtKeyUsage=function(a){KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,a);this.setPurposeArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence();for(var c=0;c0){var c=new KJUR.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(c)}var d=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=d.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize=function(){this.asn1Version=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1ThisUpdate=null;this.asn1NextUpdate=null;this.aRevokedCert=new Array()};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList,KJUR.asn1.ASN1Object);KJUR.asn1.x509.CRLEntry=function(c){KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);var b=null;var a=null;this.setCertSerial=function(d){this.sn=new KJUR.asn1.DERInteger(d)};this.setRevocationDate=function(d){this.time=new KJUR.asn1.x509.Time(d)};this.getEncodedHex=function(){var d=new KJUR.asn1.DERSequence({array:[this.sn,this.time]});this.TLV=d.getEncodedHex();return this.TLV};if(typeof c!="undefined"){if(typeof c.time!="undefined"){this.setRevocationDate(c.time)}if(typeof c.sn!="undefined"){this.setCertSerial(c.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry,KJUR.asn1.ASN1Object);KJUR.asn1.x509.X500Name=function(b){KJUR.asn1.x509.X500Name.superclass.constructor.call(this);this.asn1Array=new Array();this.setByString=function(c){var d=c.split("/");d.shift();for(var e=0;e0){h=new a.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:false})}var g=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,e,this.dSigAlg,this.dSig,];if(h!=null){g.push(h)}var f=new a.DERSequence({array:g});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.EncapsulatedContentInfo=function(c){KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dEContentType=new a.DERObjectIdentifier({name:"data"});this.dEContent=null;this.isDetached=false;this.eContentValueHex=null;this.setContentType=function(e){if(e.match(/^[0-2][.][0-9.]+$/)){this.dEContentType=new a.DERObjectIdentifier({oid:e})}else{this.dEContentType=new a.DERObjectIdentifier({name:e})}};this.setContentValue=function(e){if(typeof e!="undefined"){if(typeof e.hex=="string"){this.eContentValueHex=e.hex}else{if(typeof e.str=="string"){this.eContentValueHex=utf8tohex(e.str)}}}};this.setContentValueHex=function(e){this.eContentValueHex=e};this.setContentValueStr=function(e){this.eContentValueHex=utf8tohex(e)};this.getEncodedHex=function(){if(typeof this.eContentValueHex!="string"){throw"eContentValue not yet set"}var g=new a.DEROctetString({hex:this.eContentValueHex});this.dEContent=new a.DERTaggedObject({obj:g,tag:"a0",explicit:true});var e=[this.dEContentType];if(!this.isDetached){e.push(this.dEContent)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentInfo=function(c){KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dContentType=null;this.dContent=null;this.setContentType=function(e){if(typeof e=="string"){this.dContentType=d.OID.name2obj(e)}};this.getEncodedHex=function(){var f=new a.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:true});var e=new a.DERSequence({array:[this.dContentType,f]});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(c.type){this.setContentType(c.type)}if(c.obj&&c.obj instanceof a.ASN1Object){this.dContent=c.obj}}};YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignedData=function(c){KJUR.asn1.cms.SignedData.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dDigestAlgs=null;this.digestAlgNameList=[];this.dEncapContentInfo=new b.EncapsulatedContentInfo();this.dCerts=null;this.certificateList=[];this.crlList=[];this.signerInfoList=[new b.SignerInfo()];this.addCertificatesByPEM=function(e){var f=KEYUTIL.getHexFromPEM(e);var g=new a.ASN1Object();g.hTLV=f;this.certificateList.push(g)};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}if(this.dDigestAlgs==null){var k=[];for(var j=0;j0){var l=new a.DERSet({array:this.certificateList});this.dCerts=new a.DERTaggedObject({obj:l,tag:"a0",explicit:false})}}if(this.dCerts!=null){e.push(this.dCerts)}var g=new a.DERSet({array:this.signerInfoList});e.push(g);var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};this.getContentInfo=function(){this.getEncodedHex();var e=new b.ContentInfo({type:"signed-data",obj:this});return e};this.getContentInfoEncodedHex=function(){var e=this.getContentInfo();var f=e.getEncodedHex();return f};this.getPEM=function(){var e=this.getContentInfoEncodedHex();var f=a.ASN1Util.getPEMStringFromHex(e,"CMS");return f}};YAHOO.lang.extend(KJUR.asn1.cms.SignedData,KJUR.asn1.ASN1Object);KJUR.asn1.cms.CMSUtil=new function(){};KJUR.asn1.cms.CMSUtil.newSignedData=function(a){var h=KJUR.asn1.cms;var g=KJUR.asn1.cades;var f=new h.SignedData();f.dEncapContentInfo.setContentValue(a.content);if(typeof a.certs=="object"){for(var b=0;ba.length){d=a.length}for(var b=0;bd){throw"key is too short for SigAlg: keylen="+j+","+a}var b="0001";var k="00"+c;var g="";var l=d-b.length-k.length;for(var f=0;f=0;--p){q=q.twice2D();q.z=BigInteger.ONE;if(o.testBit(p)){if(n.testBit(p)){q=q.add2D(t)}else{q=q.add2D(s)}}else{if(n.testBit(p)){q=q.add2D(r)}}}return q}this.getBigRandom=function(i){return new BigInteger(i.bitLength(),a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)};this.setNamedCurve=function(i){this.ecparams=KJUR.crypto.ECParameterDB.getByName(i);this.prvKeyHex=null;this.pubKeyHex=null;this.curveName=i};this.setPrivateKeyHex=function(i){this.isPrivate=true;this.prvKeyHex=i};this.setPublicKeyHex=function(i){this.isPublic=true;this.pubKeyHex=i};this.generateKeyPairHex=function(){var k=this.ecparams.n;var n=this.getBigRandom(k);var l=this.ecparams.G.multiply(n);var q=l.getX().toBigInteger();var o=l.getY().toBigInteger();var i=this.ecparams.keylen/4;var m=("0000000000"+n.toString(16)).slice(-i);var r=("0000000000"+q.toString(16)).slice(-i);var p=("0000000000"+o.toString(16)).slice(-i);var j="04"+r+p;this.setPrivateKeyHex(m);this.setPublicKeyHex(j);return{ecprvhex:m,ecpubhex:j}};this.signWithMessageHash=function(i){return this.signHex(i,this.prvKeyHex)};this.signHex=function(o,j){var t=new BigInteger(j,16);var l=this.ecparams.n;var q=new BigInteger(o,16);do{var m=this.getBigRandom(l);var u=this.ecparams.G;var p=u.multiply(m);var i=p.getX().toBigInteger().mod(l)}while(i.compareTo(BigInteger.ZERO)<=0);var v=m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i,v)};this.sign=function(m,u){var q=u;var j=this.ecparams.n;var p=BigInteger.fromByteArrayUnsigned(m);do{var l=this.getBigRandom(j);var t=this.ecparams.G;var o=t.multiply(l);var i=o.getX().toBigInteger().mod(j)}while(i.compareTo(BigInteger.ZERO)<=0);var v=l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);return this.serializeSig(i,v)};this.verifyWithMessageHash=function(j,i){return this.verifyHex(j,i,this.pubKeyHex)};this.verifyHex=function(m,i,p){var l,j;var o=KJUR.crypto.ECDSA.parseSigHex(i);l=o.r;j=o.s;var k;k=ECPointFp.decodeFromHex(this.ecparams.curve,p);var n=new BigInteger(m,16);return this.verifyRaw(n,l,j,k)};this.verify=function(o,p,j){var l,i;if(Bitcoin.Util.isArray(p)){var n=this.parseSig(p);l=n.r;i=n.s}else{if("object"===typeof p&&p.r&&p.s){l=p.r;i=p.s}else{throw"Invalid value for signature"}}var k;if(j instanceof ECPointFp){k=j}else{if(Bitcoin.Util.isArray(j)){k=ECPointFp.decodeFrom(this.ecparams.curve,j)}else{throw"Invalid format for pubkey value, must be byte array or ECPointFp"}}var m=BigInteger.fromByteArrayUnsigned(o);return this.verifyRaw(m,l,i,k)};this.verifyRaw=function(o,i,w,m){var l=this.ecparams.n;var u=this.ecparams.G;if(i.compareTo(BigInteger.ONE)<0||i.compareTo(l)>=0){return false}if(w.compareTo(BigInteger.ONE)<0||w.compareTo(l)>=0){return false}var p=w.modInverse(l);var k=o.multiply(p).mod(l);var j=i.multiply(p).mod(l);var q=u.multiply(k).add(m.multiply(j));var t=q.getX().toBigInteger().mod(l);return t.equals(i)};this.serializeSig=function(k,j){var l=k.toByteArraySigned();var i=j.toByteArraySigned();var m=[];m.push(2);m.push(l.length);m=m.concat(l);m.push(2);m.push(i.length);m=m.concat(i);m.unshift(m.length);m.unshift(48);return m};this.parseSig=function(n){var m;if(n[0]!=48){throw new Error("Signature not a valid DERSequence")}m=2;if(n[m]!=2){throw new Error("First element in signature must be a DERInteger")}var l=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];if(n[m]!=2){throw new Error("Second element in signature must be a DERInteger")}var i=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];var k=BigInteger.fromByteArrayUnsigned(l);var j=BigInteger.fromByteArrayUnsigned(i);return{r:k,s:j}};this.parseSigCompact=function(m){if(m.length!==65){throw"Signature has the wrong length"}var j=m[0]-27;if(j<0||j>7){throw"Invalid signature type"}var o=this.ecparams.n;var l=BigInteger.fromByteArrayUnsigned(m.slice(1,33)).mod(o);var k=BigInteger.fromByteArrayUnsigned(m.slice(33,65)).mod(o);return{r:l,s:k,i:j}};if(h!==undefined){if(h.curve!==undefined){this.curveName=h.curve}}if(this.curveName===undefined){this.curveName=e}this.setNamedCurve(this.curveName);if(h!==undefined){if(h.prv!==undefined){this.setPrivateKeyHex(h.prv)}if(h.pub!==undefined){this.setPublicKeyHex(h.pub)}}};KJUR.crypto.ECDSA.parseSigHex=function(a){var b=KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d=new BigInteger(b.r,16);var c=new BigInteger(b.s,16);return{r:d,s:c}};KJUR.crypto.ECDSA.parseSigHexInHexRS=function(c){if(c.substr(0,2)!="30"){throw"signature is not a ASN.1 sequence"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);if(b.length!=2){throw"number of signature ASN.1 sequence elements seem wrong"}var g=b[0];var f=b[1];if(c.substr(g,2)!="02"){throw"1st item of sequene of signature is not ASN.1 integer"}if(c.substr(f,2)!="02"){throw"2nd item of sequene of signature is not ASN.1 integer"}var e=ASN1HEX.getHexOfV_AtObj(c,g);var d=ASN1HEX.getHexOfV_AtObj(c,f);return{r:e,s:d}};KJUR.crypto.ECDSA.asn1SigToConcatSig=function(c){var d=KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b=d.r;var a=d.s;if(b.substr(0,2)=="00"&&(((b.length/2)*8)%(16*8))==8){b=b.substr(2)}if(a.substr(0,2)=="00"&&(((a.length/2)*8)%(16*8))==8){a=a.substr(2)}if((((b.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig r length error"}if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig s length error"}return b+a};KJUR.crypto.ECDSA.concatSigToASN1Sig=function(a){if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA concatinated r-s sig length error"}var c=a.substr(0,a.length/2);var b=a.substr(a.length/2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c,b)};KJUR.crypto.ECDSA.hexRSSigToASN1Sig=function(b,a){var d=new BigInteger(b,16);var c=new BigInteger(a,16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d,c)};KJUR.crypto.ECDSA.biRSSigToASN1Sig=function(e,c){var b=new KJUR.asn1.DERInteger({bigint:e});var a=new KJUR.asn1.DERInteger({bigint:c});var d=new KJUR.asn1.DERSequence({array:[b,a]});return d.getEncodedHex()};
/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECParameterDB=new function(){var b={};var c={};function a(d){return new BigInteger(d,16)}this.getByName=function(e){var d=e;if(typeof c[d]!="undefined"){d=c[e]}if(typeof b[d]!="undefined"){return b[d]}throw"unregistered EC curve name: "+d};this.regist=function(A,l,o,g,m,e,j,f,k,u,d,x){b[A]={};var s=a(o);var z=a(g);var y=a(m);var t=a(e);var w=a(j);var r=new ECCurveFp(s,z,y);var q=r.decodePointHex("04"+f+k);b[A]["name"]=A;b[A]["keylen"]=l;b[A]["curve"]=r;b[A]["G"]=q;b[A]["n"]=t;b[A]["h"]=w;b[A]["oid"]=d;b[A]["info"]=x;for(var v=0;v0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){throw"invalid DSA signature"}var I=J.modInverse(u);var A=D.multiply(I).mod(u);var v=K.multiply(I).mod(u);var F=G.modPow(A,z).multiply(H.modPow(v,z)).mod(z).mod(u);return F.compareTo(K)==0};this.parseASN1Signature=function(u){try{var y=new BigInteger(ASN1HEX.getVbyList(u,0,[0],"02"),16);var v=new BigInteger(ASN1HEX.getVbyList(u,0,[1],"02"),16);return[y,v]}catch(w){throw"malformed DSA signature"}};function d(E,w,B,v,u,C){var z=KJUR.crypto.Util.hashString(w,E.toLowerCase());var z=z.substr(0,u.bitLength()/4);var A=new BigInteger(z,16);var y=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var F=(B.modPow(y,v)).mod(u);var D=(y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);var G=new Array();G[0]=F;G[1]=D;return G}function r(v){var u=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(v.bitLength()/8)){case 20:if(u!=2&&u>11&&u!=10&&u<8){return 2}return u;case 28:if(u>11&&u<8){return 11}return u;case 32:if(u>10&&u<8){return 8}return u;default:util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");return null}}this.select_hash_algorithm=r;function m(I,K,J,B,z,u,F,G){var C=KJUR.crypto.Util.hashString(B,I.toLowerCase());var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){util.print_error("invalid DSA Signature");return null}var H=J.modInverse(u);var A=D.multiply(H).mod(u);var v=K.multiply(H).mod(u);var E=F.modPow(A,z).multiply(G.modPow(v,z)).mod(z).mod(u);return E.compareTo(K)==0}function a(z){var A=new BigInteger(z,primeCenterie);var y=j(q,512);var u=t(p,q,z);var v;do{v=new BigInteger(q.bitCount(),rand)}while(x.compareTo(BigInteger.ZERO)!=1&&x.compareTo(q)!=-1);var w=g.modPow(x,p);return{x:v,q:A,p:y,g:u,y:w}}function j(y,z,w){if(z%64!=0){return false}var u;var v;do{u=w(bitcount,true);v=u.subtract(BigInteger.ONE);u=u.subtract(v.remainder(y))}while(!u.isProbablePrime(primeCenterie)||u.bitLength()!=l);return u}function t(B,z,A,w){var u=B.subtract(BigInteger.ONE);var y=u.divide(z);var v;do{v=w(A)}while(v.compareTo(u)!=-1&&v.compareTo(BigInteger.ONE)!=1);return v.modPow(y,B)}function o(w,y,u){var v;do{v=u(y,false)}while(v.compareTo(w)!=-1&&v.compareTo(BigInteger.ZERO)!=1);return v}function i(v,w){k=o(v);var u=g.modPow(k,w).mod(v);return u}function h(B,w,y,v,z,u){var A=B(v);s=(w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);return s}this.sign=d;this.verify=m;function n(w,u){if(u.compareTo(w)<=0){return}var v=u.subtract(w);var y=e(v.bitLength());while(y>v){y=e(v.bitLength())}return w.add(y)}function e(w){if(w<0){return null}var u=Math.floor((w+7)/8);var v=c(u);if(w%8>0){v=String.fromCharCode((Math.pow(2,w%8)-1)&v.charCodeAt(0))+v.substring(1)}return new BigInteger(f(v),16)}function c(w){var u="";for(var v=0;v=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}();
/*! keyutil-1.0.12.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(s,x,u,q){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(u);var p=CryptoJS.enc.Hex.parse(q);var t={};t.key=w;t.iv=p;t.ciphertext=r;var v=s.decrypt(t,w,{iv:p});return CryptoJS.enc.Hex.stringify(v)};var l=function(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(t,y,v,q){var s=CryptoJS.enc.Hex.parse(y);var x=CryptoJS.enc.Hex.parse(v);var p=CryptoJS.enc.Hex.parse(q);var w=t.encrypt(s,x,{iv:p});var r=CryptoJS.enc.Hex.parse(w.toString());var u=CryptoJS.enc.Base64.stringify(r);return u};var i={"AES-256-CBC":{proc:d,eproc:l,keylen:32,ivlen:16},"AES-192-CBC":{proc:d,eproc:l,keylen:24,ivlen:16},"AES-128-CBC":{proc:d,eproc:l,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:o,keylen:24,ivlen:8},"DES-CBC":{proc:a,eproc:f,keylen:8,ivlen:8}};var c=function(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(q,y,p){var v=p.substring(0,16);var t=CryptoJS.enc.Hex.parse(v);var r=CryptoJS.enc.Utf8.parse(y);var u=i[q]["keylen"]+i[q]["ivlen"];var x="";var w=null;for(;;){var s=CryptoJS.algo.MD5.create();if(w!=null){s.update(w)}s.update(r);s.update(t);w=s.finalize();x=x+CryptoJS.enc.Hex.stringify(w);if(x.length>=u*2){break}}var z={};z.keyhex=x.substr(0,i[q]["keylen"]*2);z.ivhex=x.substr(i[q]["keylen"]*2,i[q]["ivlen"]*2);return z};var b=function(p,v,r,w){var s=CryptoJS.enc.Base64.parse(p);var q=CryptoJS.enc.Hex.stringify(s);var u=i[v]["proc"];var t=u(q,r,w);return t};var h=function(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(y,x){var q=n(y);var t=q.type;var r=q.cipher;var p=q.ivsalt;var s=q.data;var w=j(r,x,p);var v=w.keyhex;var u=b(s,r,v,p);return u},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(x,s,A,t,r){var p="";if(typeof t=="undefined"||t==null){t="AES-256-CBC"}if(typeof i[t]=="undefined"){throw"KEYUTIL unsupported algorithm: "+t}if(typeof r=="undefined"||r==null){var v=i[t]["ivlen"];var u=m(v);r=u.toUpperCase()}var z=j(t,A,r);var y=z.keyhex;var w=h(s,t,y,r);var q=w.replace(/(.{64})/g,"$1\r\n");var p="-----BEGIN "+x+" PRIVATE KEY-----\r\n";p+="Proc-Type: 4,ENCRYPTED\r\n";p+="DEK-Info: "+t+","+r+"\r\n";p+="\r\n";p+=q;p+="\r\n-----END "+x+" PRIVATE KEY-----\r\n";return p},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(u,p){var t=CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q=u.pbkdf2Iter;var s=CryptoJS.PBKDF2(p,t,{keySize:192/32,iterations:q});var r=CryptoJS.enc.Hex.stringify(s);return r},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(x,y){var r=this.getHexFromPEM(x,"ENCRYPTED PRIVATE KEY");var p=this.parseHexOfEncryptedPKCS8(r);var u=KEYUTIL.getPBKDF2KeyHexFromParam(p,y);var v={};v.ciphertext=CryptoJS.enc.Hex.parse(p.ciphertext);var t=CryptoJS.enc.Hex.parse(u);var s=CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w=CryptoJS.TripleDES.decrypt(v,t,{iv:s});var q=CryptoJS.enc.Hex.stringify(w);return q},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(s.substr(r[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,r[1]);if(p.length!=2){throw"malformed PKCS8 private key(code:004)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"malformed RSA key(code:002)"}if(r.substr(q[0],2)!="02"){throw"malformed RSA key(code:003)"}p.n=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(f,e,h){if(typeof RSAKey!="undefined"&&f instanceof RSAKey){return f}if(typeof KJUR.crypto.ECDSA!="undefined"&&f instanceof KJUR.crypto.ECDSA){return f}if(typeof KJUR.crypto.DSA!="undefined"&&f instanceof KJUR.crypto.DSA){return f}if(f.curve!==undefined&&f.xy!==undefined&&f.d===undefined){return new KJUR.crypto.ECDSA({pub:f.xy,curve:f.curve})}if(f.curve!==undefined&&f.d!==undefined){return new KJUR.crypto.ECDSA({prv:f.d,curve:f.curve})}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(f.n,f.e);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.co!==undefined&&f.qi===undefined){var w=new RSAKey();w.setPrivateEx(f.n,f.e,f.d,f.p,f.q,f.dp,f.dq,f.co);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p===undefined){var w=new RSAKey();w.setPrivate(f.n,f.e,f.d);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x===undefined){var w=new KJUR.crypto.DSA();w.setPublic(f.p,f.q,f.g,f.y);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x!==undefined){var w=new KJUR.crypto.DSA();w.setPrivate(f.p,f.q,f.g,f.y,f.x);return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(b64utohex(f.n),b64utohex(f.e));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.qi!==undefined){var w=new RSAKey();w.setPrivateEx(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d),b64utohex(f.p),b64utohex(f.q),b64utohex(f.dp),b64utohex(f.dq),b64utohex(f.qi));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined){var w=new RSAKey();w.setPrivate(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d));return w}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d===undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;d.setPublicKeyHex(m);return d}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d!==undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var a=("0000000000"+b64utohex(f.d)).slice(-l);d.setPrivateKeyHex(a);return d}if(f.indexOf("-END CERTIFICATE-",0)!=-1||f.indexOf("-END X509 CERTIFICATE-",0)!=-1||f.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(f)}if(h==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(f)}if(f.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(f)}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var i=KEYUTIL.getHexFromPEM(f,"RSA PRIVATE KEY");return KEYUTIL.getKey(i,null,"pkcs5prv")}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var u=this.getHexFromPEM(f,"DSA PRIVATE KEY");var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(f)}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(f,e)}if(f.indexOf("-END EC PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var w=ASN1HEX.getVbyList(u,0,[1],"04");var c=ASN1HEX.getVbyList(u,0,[2,0],"06");var o=ASN1HEX.getVbyList(u,0,[3,0],"03").substr(2);var b="";if(KJUR.crypto.OID.oidhex2name[c]!==undefined){b=KJUR.crypto.OID.oidhex2name[c]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+c}var d=new KJUR.crypto.ECDSA({name:b});d.setPublicKeyHex(o);d.setPrivateKeyHex(w);d.isPublic=false;return d}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(f,e)}throw"not supported argument"};KEYUTIL.generateKeypair=function(a,c){if(a=="RSA"){var b=c;var h=new RSAKey();h.generate(b,"10001");h.isPrivate=true;h.isPublic=true;var f=new RSAKey();var e=h.n.toString(16);var i=h.e.toString(16);f.setPublic(e,i);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{if(a=="EC"){var d=c;var g=new KJUR.crypto.ECDSA({curve:d});var j=g.generateKeyPairHex();var h=new KJUR.crypto.ECDSA({curve:d});h.setPrivateKeyHex(j.ecprvhex);h.isPrivate=true;h.isPublic=false;var f=new KJUR.crypto.ECDSA({curve:d});f.setPublicKeyHex(j.ecpubhex);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{throw"unknown algorithm: "+a}}};KEYUTIL.getPEM=function(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.n}},{"int":s.e},{"int":{bigint:s.d}},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.dmp1}},{"int":{bigint:s.dmq1}},{"int":{bigint:s.coeff}}]});return w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(b,"CERTIFICATE REQUEST");var c=KEYUTIL.getKeyFromCSRHex(a);return c};KEYUTIL.getKeyFromCSRHex=function(a){var c=KEYUTIL.parseCSRHex(a);var b=KEYUTIL.getKey(c.p8pubkeyhex,null,"pkcs8pub");return b};KEYUTIL.parseCSRHex=function(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,a[2]);return b};
/*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString;
/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(f){return KJUR.crypto.Util.hashString(f,a)};var c=b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c,a,e)}function _zeroPaddingOfSignature(e,d){var c="";var a=d/4-e.length;for(var b=0;b>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(l,a,k){var b=hextorstr(l);var g=b.length;var m=this.n.bitLength()-1;var c=Math.ceil(m/8);var d;var o=function(i){return KJUR.crypto.Util.hashHex(i,a)};if(k===-1||k===undefined){k=g}else{if(k===-2){k=c-g-2}else{if(k<-2){throw"invalid salt length"}}}if(c<(g+k+2)){throw"data too long"}var f="";if(k>0){f=new Array(k);new SecureRandom().nextBytes(f);f=String.fromCharCode.apply(String,f)}var n=hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+b+f)));var j=[];for(d=0;d>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.n.bitLength()){return 0}var i=this.doPublic(b);var e=i.toString(16).replace(/^1f+00/,"");var g=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(g.length==0){return false}var d=g[0];var h=g[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(e,a){a=a.replace(_RE_HEXDECONLY,"");a=a.replace(/[ \n]+/g,"");var b=parseBigInt(a,16);if(b.bitLength()>this.n.bitLength()){return 0}var h=this.doPublic(b);var g=h.toString(16).replace(/^1f+00/,"");var c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if(c.length==0){return false}var d=c[0];var f=c[1];return(f==e)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(g){return KJUR.crypto.Util.hashHex(g,a)};var d=e(rstrtohex(c));if(f===undefined){f=-1}return this.verifyWithMessageHashPSS(d,b,a,f)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(i){return KJUR.crypto.Util.hashHex(i,l)};var j=hextorstr(f);var h=j.length;var g=this.n.bitLength()-1;var m=Math.ceil(g/8);var q;if(c===-1||c===undefined){c=h}else{if(c===-2){c=m-h-2}else{if(c<-2){throw"invalid salt length"}}}if(m<(h+c+2)){throw"data too long"}var a=this.doPublic(k).toByteArray();for(q=0;q>(8*m-g))&255;if((d.charCodeAt(0)&p)!==0){throw"bits beyond keysize not zero"}var n=pss_mgf1_str(e,d.length,r);var o=[];for(q=0;q0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};KJUR.jws.JWS.parse=function(g){var c=g.split(".");var b={};var f,e,d;if(c.length!=2&&c.length!=3){throw"malformed sJWS: wrong number of '.' splitted elements"}f=c[0];e=c[1];if(c.length==3){d=c[2]}b.headerObj=KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));b.payloadObj=KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));b.headerPP=JSON.stringify(b.headerObj,null," ");if(b.payloadObj==null){b.payloadPP=b64utoutf8(e)}else{b.payloadPP=JSON.stringify(b.payloadObj,null," ")}if(d!==undefined){b.sigHex=b64utohex(d)}return b};KJUR.jws.JWS.verifyJWT=function(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt=="number"){b=l.verifyAt}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp
* @license MIT
*/
/* eslint-disable no-proto */
'use strict'
var base64 = __webpack_require__(306)
var ieee754 = __webpack_require__(307)
var isArray = __webpack_require__(308)
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
Buffer.poolSize = 8192 // not used by this implementation
var rootParent = {}
/**
* If `Buffer.TYPED_ARRAY_SUPPORT`:
* === true Use Uint8Array implementation (fastest)
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Due to various browser bugs, sometimes the Object implementation will be used even
* when the browser supports typed arrays.
*
* Note:
*
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
* on objects.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
* get the Object implementation, which is slower but behaves correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
? global.TYPED_ARRAY_SUPPORT
: typedArraySupport()
function typedArraySupport () {
function Bar () {}
try {
var arr = new Uint8Array(1)
arr.foo = function () { return 42 }
arr.constructor = Bar
return arr.foo() === 42 && // typed array instances can be augmented
arr.constructor === Bar && // constructor can be set
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
} catch (e) {
return false
}
}
function kMaxLength () {
return Buffer.TYPED_ARRAY_SUPPORT
? 0x7fffffff
: 0x3fffffff
}
/**
* Class: Buffer
* =============
*
* The Buffer constructor returns instances of `Uint8Array` that are augmented
* with function properties for all the node `Buffer` API functions. We use
* `Uint8Array` so that square bracket notation works as expected -- it returns
* a single octet.
*
* By augmenting the instances, we can avoid modifying the `Uint8Array`
* prototype.
*/
function Buffer (arg) {
if (!(this instanceof Buffer)) {
// Avoid going through an ArgumentsAdaptorTrampoline in the common case.
if (arguments.length > 1) return new Buffer(arg, arguments[1])
return new Buffer(arg)
}
if (!Buffer.TYPED_ARRAY_SUPPORT) {
this.length = 0
this.parent = undefined
}
// Common case.
if (typeof arg === 'number') {
return fromNumber(this, arg)
}
// Slightly less common case.
if (typeof arg === 'string') {
return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
}
// Unusual.
return fromObject(this, arg)
}
function fromNumber (that, length) {
that = allocate(that, length < 0 ? 0 : checked(length) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < length; i++) {
that[i] = 0
}
}
return that
}
function fromString (that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
// Assumption: byteLength() return value is always < kMaxLength.
var length = byteLength(string, encoding) | 0
that = allocate(that, length)
that.write(string, encoding)
return that
}
function fromObject (that, object) {
if (Buffer.isBuffer(object)) return fromBuffer(that, object)
if (isArray(object)) return fromArray(that, object)
if (object == null) {
throw new TypeError('must start with number, buffer, array or string')
}
if (typeof ArrayBuffer !== 'undefined') {
if (object.buffer instanceof ArrayBuffer) {
return fromTypedArray(that, object)
}
if (object instanceof ArrayBuffer) {
return fromArrayBuffer(that, object)
}
}
if (object.length) return fromArrayLike(that, object)
return fromJsonObject(that, object)
}
function fromBuffer (that, buffer) {
var length = checked(buffer.length) | 0
that = allocate(that, length)
buffer.copy(that, 0, 0, length)
return that
}
function fromArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Duplicate of fromArray() to keep fromArray() monomorphic.
function fromTypedArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
// Truncating the elements is probably not what people expect from typed
// arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
// of the old Buffer constructor.
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function fromArrayBuffer (that, array) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
array.byteLength
that = Buffer._augment(new Uint8Array(array))
} else {
// Fallback: Return an object instance of the Buffer class
that = fromTypedArray(that, new Uint8Array(array))
}
return that
}
function fromArrayLike (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
// Returns a zero-length buffer for inputs that don't conform to the spec.
function fromJsonObject (that, object) {
var array
var length = 0
if (object.type === 'Buffer' && isArray(object.data)) {
array = object.data
length = checked(array.length) | 0
}
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array
} else {
// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined
}
function allocate (that, length) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = Buffer._augment(new Uint8Array(length))
that.__proto__ = Buffer.prototype
} else {
// Fallback: Return an object instance of the Buffer class
that.length = length
that._isBuffer = true
}
var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
if (fromPool) that.parent = rootParent
return that
}
function checked (length) {
// Note: cannot use `length < kMaxLength` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if (length >= kMaxLength()) {
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + kMaxLength().toString(16) + ' bytes')
}
return length | 0
}
function SlowBuffer (subject, encoding) {
if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
var buf = new Buffer(subject, encoding)
delete buf.parent
return buf
}
Buffer.isBuffer = function isBuffer (b) {
return !!(b != null && b._isBuffer)
}
Buffer.compare = function compare (a, b) {
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
throw new TypeError('Arguments must be Buffers')
}
if (a === b) return 0
var x = a.length
var y = b.length
var i = 0
var len = Math.min(x, y)
while (i < len) {
if (a[i] !== b[i]) break
++i
}
if (i !== len) {
x = a[i]
y = b[i]
}
if (x < y) return -1
if (y < x) return 1
return 0
}
Buffer.isEncoding = function isEncoding (encoding) {
switch (String(encoding).toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'raw':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return true
default:
return false
}
}
Buffer.concat = function concat (list, length) {
if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
if (list.length === 0) {
return new Buffer(0)
}
var i
if (length === undefined) {
length = 0
for (i = 0; i < list.length; i++) {
length += list[i].length
}
}
var buf = new Buffer(length)
var pos = 0
for (i = 0; i < list.length; i++) {
var item = list[i]
item.copy(buf, pos)
pos += item.length
}
return buf
}
function byteLength (string, encoding) {
if (typeof string !== 'string') string = '' + string
var len = string.length
if (len === 0) return 0
// Use a for loop to avoid recursion
var loweredCase = false
for (;;) {
switch (encoding) {
case 'ascii':
case 'binary':
// Deprecated
case 'raw':
case 'raws':
return len
case 'utf8':
case 'utf-8':
return utf8ToBytes(string).length
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return len * 2
case 'hex':
return len >>> 1
case 'base64':
return base64ToBytes(string).length
default:
if (loweredCase) return utf8ToBytes(string).length // assume utf8
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.byteLength = byteLength
function slowToString (encoding, start, end) {
var loweredCase = false
start = start | 0
end = end === undefined || end === Infinity ? this.length : end | 0
if (!encoding) encoding = 'utf8'
if (start < 0) start = 0
if (end > this.length) end = this.length
if (end <= start) return ''
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end)
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end)
case 'ascii':
return asciiSlice(this, start, end)
case 'binary':
return binarySlice(this, start, end)
case 'base64':
return base64Slice(this, start, end)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = (encoding + '').toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toString = function toString () {
var length = this.length | 0
if (length === 0) return ''
if (arguments.length === 0) return utf8Slice(this, 0, length)
return slowToString.apply(this, arguments)
}
Buffer.prototype.equals = function equals (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return true
return Buffer.compare(this, b) === 0
}
Buffer.prototype.inspect = function inspect () {
var str = ''
var max = exports.INSPECT_MAX_BYTES
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
if (this.length > max) str += ' ... '
}
return ''
}
Buffer.prototype.compare = function compare (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return 0
return Buffer.compare(this, b)
}
Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
else if (byteOffset < -0x80000000) byteOffset = -0x80000000
byteOffset >>= 0
if (this.length === 0) return -1
if (byteOffset >= this.length) return -1
// Negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
if (typeof val === 'string') {
if (val.length === 0) return -1 // special case: looking for empty string always fails
return String.prototype.indexOf.call(this, val, byteOffset)
}
if (Buffer.isBuffer(val)) {
return arrayIndexOf(this, val, byteOffset)
}
if (typeof val === 'number') {
if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
}
return arrayIndexOf(this, [ val ], byteOffset)
}
function arrayIndexOf (arr, val, byteOffset) {
var foundIndex = -1
for (var i = 0; byteOffset + i < arr.length; i++) {
if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
} else {
foundIndex = -1
}
}
return -1
}
throw new TypeError('val must be string, number or Buffer')
}
// `get` is deprecated
Buffer.prototype.get = function get (offset) {
console.log('.get() is deprecated. Access using array indexes instead.')
return this.readUInt8(offset)
}
// `set` is deprecated
Buffer.prototype.set = function set (v, offset) {
console.log('.set() is deprecated. Access using array indexes instead.')
return this.writeUInt8(v, offset)
}
function hexWrite (buf, string, offset, length) {
offset = Number(offset) || 0
var remaining = buf.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
// must be an even number of digits
var strLen = string.length
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
if (length > strLen / 2) {
length = strLen / 2
}
for (var i = 0; i < length; i++) {
var parsed = parseInt(string.substr(i * 2, 2), 16)
if (isNaN(parsed)) throw new Error('Invalid hex string')
buf[offset + i] = parsed
}
return i
}
function utf8Write (buf, string, offset, length) {
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}
function asciiWrite (buf, string, offset, length) {
return blitBuffer(asciiToBytes(string), buf, offset, length)
}
function binaryWrite (buf, string, offset, length) {
return asciiWrite(buf, string, offset, length)
}
function base64Write (buf, string, offset, length) {
return blitBuffer(base64ToBytes(string), buf, offset, length)
}
function ucs2Write (buf, string, offset, length) {
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}
Buffer.prototype.write = function write (string, offset, length, encoding) {
// Buffer#write(string)
if (offset === undefined) {
encoding = 'utf8'
length = this.length
offset = 0
// Buffer#write(string, encoding)
} else if (length === undefined && typeof offset === 'string') {
encoding = offset
length = this.length
offset = 0
// Buffer#write(string, offset[, length][, encoding])
} else if (isFinite(offset)) {
offset = offset | 0
if (isFinite(length)) {
length = length | 0
if (encoding === undefined) encoding = 'utf8'
} else {
encoding = length
length = undefined
}
// legacy write(string, encoding, offset, length) - remove in v0.13
} else {
var swap = encoding
encoding = offset
offset = length | 0
length = swap
}
var remaining = this.length - offset
if (length === undefined || length > remaining) length = remaining
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
throw new RangeError('attempt to write outside buffer bounds')
}
if (!encoding) encoding = 'utf8'
var loweredCase = false
for (;;) {
switch (encoding) {
case 'hex':
return hexWrite(this, string, offset, length)
case 'utf8':
case 'utf-8':
return utf8Write(this, string, offset, length)
case 'ascii':
return asciiWrite(this, string, offset, length)
case 'binary':
return binaryWrite(this, string, offset, length)
case 'base64':
// Warning: maxLength not taken into account in base64Write
return base64Write(this, string, offset, length)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return ucs2Write(this, string, offset, length)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toJSON = function toJSON () {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
}
}
function base64Slice (buf, start, end) {
if (start === 0 && end === buf.length) {
return base64.fromByteArray(buf)
} else {
return base64.fromByteArray(buf.slice(start, end))
}
}
function utf8Slice (buf, start, end) {
end = Math.min(buf.length, end)
var res = []
var i = start
while (i < end) {
var firstByte = buf[i]
var codePoint = null
var bytesPerSequence = (firstByte > 0xEF) ? 4
: (firstByte > 0xDF) ? 3
: (firstByte > 0xBF) ? 2
: 1
if (i + bytesPerSequence <= end) {
var secondByte, thirdByte, fourthByte, tempCodePoint
switch (bytesPerSequence) {
case 1:
if (firstByte < 0x80) {
codePoint = firstByte
}
break
case 2:
secondByte = buf[i + 1]
if ((secondByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
if (tempCodePoint > 0x7F) {
codePoint = tempCodePoint
}
}
break
case 3:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
codePoint = tempCodePoint
}
}
break
case 4:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
fourthByte = buf[i + 3]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
codePoint = tempCodePoint
}
}
}
}
if (codePoint === null) {
// we did not generate a valid codePoint so insert a
// replacement char (U+FFFD) and advance only 1 byte
codePoint = 0xFFFD
bytesPerSequence = 1
} else if (codePoint > 0xFFFF) {
// encode to utf16 (surrogate pair dance)
codePoint -= 0x10000
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
codePoint = 0xDC00 | codePoint & 0x3FF
}
res.push(codePoint)
i += bytesPerSequence
}
return decodeCodePointsArray(res)
}
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000
function decodeCodePointsArray (codePoints) {
var len = codePoints.length
if (len <= MAX_ARGUMENTS_LENGTH) {
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
}
// Decode in chunks to avoid "call stack size exceeded".
var res = ''
var i = 0
while (i < len) {
res += String.fromCharCode.apply(
String,
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
)
}
return res
}
function asciiSlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i] & 0x7F)
}
return ret
}
function binarySlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i])
}
return ret
}
function hexSlice (buf, start, end) {
var len = buf.length
if (!start || start < 0) start = 0
if (!end || end < 0 || end > len) end = len
var out = ''
for (var i = start; i < end; i++) {
out += toHex(buf[i])
}
return out
}
function utf16leSlice (buf, start, end) {
var bytes = buf.slice(start, end)
var res = ''
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
}
return res
}
Buffer.prototype.slice = function slice (start, end) {
var len = this.length
start = ~~start
end = end === undefined ? len : ~~end
if (start < 0) {
start += len
if (start < 0) start = 0
} else if (start > len) {
start = len
}
if (end < 0) {
end += len
if (end < 0) end = 0
} else if (end > len) {
end = len
}
if (end < start) end = start
var newBuf
if (Buffer.TYPED_ARRAY_SUPPORT) {
newBuf = Buffer._augment(this.subarray(start, end))
} else {
var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; i++) {
newBuf[i] = this[i + start]
}
}
if (newBuf.length) newBuf.parent = this.parent || this
return newBuf
}
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset (offset, ext, length) {
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
return val
}
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) {
checkOffset(offset, byteLength, this.length)
}
var val = this[offset + --byteLength]
var mul = 1
while (byteLength > 0 && (mul *= 0x100)) {
val += this[offset + --byteLength] * mul
}
return val
}
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
return this[offset]
}
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return this[offset] | (this[offset + 1] << 8)
}
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return (this[offset] << 8) | this[offset + 1]
}
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ((this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16)) +
(this[offset + 3] * 0x1000000)
}
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] * 0x1000000) +
((this[offset + 1] << 16) |
(this[offset + 2] << 8) |
this[offset + 3])
}
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var i = byteLength
var mul = 1
var val = this[offset + --i]
while (i > 0 && (mul *= 0x100)) {
val += this[offset + --i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
if (!(this[offset] & 0x80)) return (this[offset])
return ((0xff - this[offset] + 1) * -1)
}
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset] | (this[offset + 1] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset + 1] | (this[offset] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16) |
(this[offset + 3] << 24)
}
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] << 24) |
(this[offset + 1] << 16) |
(this[offset + 2] << 8) |
(this[offset + 3])
}
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, true, 23, 4)
}
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, false, 23, 4)
}
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, true, 52, 8)
}
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, false, 52, 8)
}
function checkInt (buf, value, offset, ext, max, min) {
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
}
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var mul = 1
var i = 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var i = byteLength - 1
var mul = 1
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
this[offset] = (value & 0xff)
return offset + 1
}
function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8
}
}
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
}
}
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = (value >>> 24)
this[offset + 2] = (value >>> 16)
this[offset + 1] = (value >>> 8)
this[offset] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = 0
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = byteLength - 1
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
if (value < 0) value = 0xff + value + 1
this[offset] = (value & 0xff)
return offset + 1
}
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
this[offset + 2] = (value >>> 16)
this[offset + 3] = (value >>> 24)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (value < 0) value = 0xffffffff + value + 1
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
function checkIEEE754 (buf, value, offset, ext, max, min) {
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
if (offset < 0) throw new RangeError('index out of range')
}
function writeFloat (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
}
ieee754.write(buf, value, offset, littleEndian, 23, 4)
return offset + 4
}
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert)
}
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert)
}
function writeDouble (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
}
ieee754.write(buf, value, offset, littleEndian, 52, 8)
return offset + 8
}
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert)
}
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert)
}
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
if (!start) start = 0
if (!end && end !== 0) end = this.length
if (targetStart >= target.length) targetStart = target.length
if (!targetStart) targetStart = 0
if (end > 0 && end < start) end = start
// Copy 0 bytes; we're done
if (end === start) return 0
if (target.length === 0 || this.length === 0) return 0
// Fatal error conditions
if (targetStart < 0) {
throw new RangeError('targetStart out of bounds')
}
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
if (end < 0) throw new RangeError('sourceEnd out of bounds')
// Are we oob?
if (end > this.length) end = this.length
if (target.length - targetStart < end - start) {
end = target.length - targetStart + start
}
var len = end - start
var i
if (this === target && start < targetStart && targetStart < end) {
// descending copy from end
for (i = len - 1; i >= 0; i--) {
target[i + targetStart] = this[i + start]
}
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start
for (i = 0; i < len; i++) {
target[i + targetStart] = this[i + start]
}
} else {
target._set(this.subarray(start, start + len), targetStart)
}
return len
}
// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function fill (value, start, end) {
if (!value) value = 0
if (!start) start = 0
if (!end) end = this.length
if (end < start) throw new RangeError('end < start')
// Fill 0 bytes; we're done
if (end === start) return
if (this.length === 0) return
if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
var i
if (typeof value === 'number') {
for (i = start; i < end; i++) {
this[i] = value
}
} else {
var bytes = utf8ToBytes(value.toString())
var len = bytes.length
for (i = start; i < end; i++) {
this[i] = bytes[i % len]
}
}
return this
}
/**
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
*/
Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
if (typeof Uint8Array !== 'undefined') {
if (Buffer.TYPED_ARRAY_SUPPORT) {
return (new Buffer(this)).buffer
} else {
var buf = new Uint8Array(this.length)
for (var i = 0, len = buf.length; i < len; i += 1) {
buf[i] = this[i]
}
return buf.buffer
}
} else {
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
}
}
// HELPER FUNCTIONS
// ================
var BP = Buffer.prototype
/**
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
*/
Buffer._augment = function _augment (arr) {
arr.constructor = Buffer
arr._isBuffer = true
// save reference to original Uint8Array set method before overwriting
arr._set = arr.set
// deprecated
arr.get = BP.get
arr.set = BP.set
arr.write = BP.write
arr.toString = BP.toString
arr.toLocaleString = BP.toString
arr.toJSON = BP.toJSON
arr.equals = BP.equals
arr.compare = BP.compare
arr.indexOf = BP.indexOf
arr.copy = BP.copy
arr.slice = BP.slice
arr.readUIntLE = BP.readUIntLE
arr.readUIntBE = BP.readUIntBE
arr.readUInt8 = BP.readUInt8
arr.readUInt16LE = BP.readUInt16LE
arr.readUInt16BE = BP.readUInt16BE
arr.readUInt32LE = BP.readUInt32LE
arr.readUInt32BE = BP.readUInt32BE
arr.readIntLE = BP.readIntLE
arr.readIntBE = BP.readIntBE
arr.readInt8 = BP.readInt8
arr.readInt16LE = BP.readInt16LE
arr.readInt16BE = BP.readInt16BE
arr.readInt32LE = BP.readInt32LE
arr.readInt32BE = BP.readInt32BE
arr.readFloatLE = BP.readFloatLE
arr.readFloatBE = BP.readFloatBE
arr.readDoubleLE = BP.readDoubleLE
arr.readDoubleBE = BP.readDoubleBE
arr.writeUInt8 = BP.writeUInt8
arr.writeUIntLE = BP.writeUIntLE
arr.writeUIntBE = BP.writeUIntBE
arr.writeUInt16LE = BP.writeUInt16LE
arr.writeUInt16BE = BP.writeUInt16BE
arr.writeUInt32LE = BP.writeUInt32LE
arr.writeUInt32BE = BP.writeUInt32BE
arr.writeIntLE = BP.writeIntLE
arr.writeIntBE = BP.writeIntBE
arr.writeInt8 = BP.writeInt8
arr.writeInt16LE = BP.writeInt16LE
arr.writeInt16BE = BP.writeInt16BE
arr.writeInt32LE = BP.writeInt32LE
arr.writeInt32BE = BP.writeInt32BE
arr.writeFloatLE = BP.writeFloatLE
arr.writeFloatBE = BP.writeFloatBE
arr.writeDoubleLE = BP.writeDoubleLE
arr.writeDoubleBE = BP.writeDoubleBE
arr.fill = BP.fill
arr.inspect = BP.inspect
arr.toArrayBuffer = BP.toArrayBuffer
return arr
}
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
function base64clean (str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
// Node converts strings with length < 2 to ''
if (str.length < 2) return ''
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '='
}
return str
}
function stringtrim (str) {
if (str.trim) return str.trim()
return str.replace(/^\s+|\s+$/g, '')
}
function toHex (n) {
if (n < 16) return '0' + n.toString(16)
return n.toString(16)
}
function utf8ToBytes (string, units) {
units = units || Infinity
var codePoint
var length = string.length
var leadSurrogate = null
var bytes = []
for (var i = 0; i < length; i++) {
codePoint = string.charCodeAt(i)
// is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (!leadSurrogate) {
// no lead yet
if (codePoint > 0xDBFF) {
// unexpected trail
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
} else if (i + 1 === length) {
// unpaired lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
}
// valid lead
leadSurrogate = codePoint
continue
}
// 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = codePoint
continue
}
// valid surrogate pair
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
}
leadSurrogate = null
// encode utf8
if (codePoint < 0x80) {
if ((units -= 1) < 0) break
bytes.push(codePoint)
} else if (codePoint < 0x800) {
if ((units -= 2) < 0) break
bytes.push(
codePoint >> 0x6 | 0xC0,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x10000) {
if ((units -= 3) < 0) break
bytes.push(
codePoint >> 0xC | 0xE0,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x110000) {
if ((units -= 4) < 0) break
bytes.push(
codePoint >> 0x12 | 0xF0,
codePoint >> 0xC & 0x3F | 0x80,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else {
throw new Error('Invalid code point')
}
}
return bytes
}
function asciiToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF)
}
return byteArray
}
function utf16leToBytes (str, units) {
var c, hi, lo
var byteArray = []
for (var i = 0; i < str.length; i++) {
if ((units -= 2) < 0) break
c = str.charCodeAt(i)
hi = c >> 8
lo = c % 256
byteArray.push(lo)
byteArray.push(hi)
}
return byteArray
}
function base64ToBytes (str) {
return base64.toByteArray(base64clean(str))
}
function blitBuffer (src, dst, offset, length) {
for (var i = 0; i < length; i++) {
if ((i + offset >= dst.length) || (i >= src.length)) break
dst[i + offset] = src[i]
}
return i
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(305).Buffer, (function() { return this; }())))
/***/ },
/* 306 */
/***/ function(module, exports, __webpack_require__) {
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
;(function (exports) {
'use strict';
var Arr = (typeof Uint8Array !== 'undefined')
? Uint8Array
: Array
var PLUS = '+'.charCodeAt(0)
var SLASH = '/'.charCodeAt(0)
var NUMBER = '0'.charCodeAt(0)
var LOWER = 'a'.charCodeAt(0)
var UPPER = 'A'.charCodeAt(0)
var PLUS_URL_SAFE = '-'.charCodeAt(0)
var SLASH_URL_SAFE = '_'.charCodeAt(0)
function decode (elt) {
var code = elt.charCodeAt(0)
if (code === PLUS ||
code === PLUS_URL_SAFE)
return 62 // '+'
if (code === SLASH ||
code === SLASH_URL_SAFE)
return 63 // '/'
if (code < NUMBER)
return -1 //no match
if (code < NUMBER + 10)
return code - NUMBER + 26 + 26
if (code < UPPER + 26)
return code - UPPER
if (code < LOWER + 26)
return code - LOWER + 26
}
function b64ToByteArray (b64) {
var i, j, l, tmp, placeHolders, arr
if (b64.length % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
var len = b64.length
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
// base64 is 4/3 + up to two characters of the original data
arr = new Arr(b64.length * 3 / 4 - placeHolders)
// if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? b64.length - 4 : b64.length
var L = 0
function push (v) {
arr[L++] = v
}
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
push((tmp & 0xFF0000) >> 16)
push((tmp & 0xFF00) >> 8)
push(tmp & 0xFF)
}
if (placeHolders === 2) {
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
push(tmp & 0xFF)
} else if (placeHolders === 1) {
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
push((tmp >> 8) & 0xFF)
push(tmp & 0xFF)
}
return arr
}
function uint8ToBase64 (uint8) {
var i,
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
output = "",
temp, length
function encode (num) {
return lookup.charAt(num)
}
function tripletToBase64 (num) {
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
}
// go through the array every three bytes, we'll deal with trailing stuff later
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
output += tripletToBase64(temp)
}
// pad the end with zeros, but make sure to not forget the extra bytes
switch (extraBytes) {
case 1:
temp = uint8[uint8.length - 1]
output += encode(temp >> 2)
output += encode((temp << 4) & 0x3F)
output += '=='
break
case 2:
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
output += encode(temp >> 10)
output += encode((temp >> 4) & 0x3F)
output += encode((temp << 2) & 0x3F)
output += '='
break
}
return output
}
exports.toByteArray = b64ToByteArray
exports.fromByteArray = uint8ToBase64
}( false ? (this.base64js = {}) : exports))
/***/ },
/* 307 */
/***/ function(module, exports) {
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
var e, m
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var nBits = -7
var i = isLE ? (nBytes - 1) : 0
var d = isLE ? -1 : 1
var s = buffer[offset + i]
i += d
e = s & ((1 << (-nBits)) - 1)
s >>= (-nBits)
nBits += eLen
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
m = e & ((1 << (-nBits)) - 1)
e >>= (-nBits)
nBits += mLen
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
if (e === 0) {
e = 1 - eBias
} else if (e === eMax) {
return m ? NaN : ((s ? -1 : 1) * Infinity)
} else {
m = m + Math.pow(2, mLen)
e = e - eBias
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
var i = isLE ? 0 : (nBytes - 1)
var d = isLE ? 1 : -1
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
value = Math.abs(value)
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0
e = eMax
} else {
e = Math.floor(Math.log(value) / Math.LN2)
if (value * (c = Math.pow(2, -e)) < 1) {
e--
c *= 2
}
if (e + eBias >= 1) {
value += rt / c
} else {
value += rt * Math.pow(2, 1 - eBias)
}
if (value * c >= 2) {
e++
c /= 2
}
if (e + eBias >= eMax) {
m = 0
e = eMax
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen)
e = e + eBias
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
e = 0
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
e = (e << mLen) | m
eLen += mLen
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
buffer[offset + i - d] |= s * 128
}
/***/ },
/* 308 */
/***/ function(module, exports) {
var toString = {}.toString;
module.exports = Array.isArray || function (arr) {
return toString.call(arr) == '[object Array]';
};
/***/ },
/* 309 */
/***/ function(module, exports) {
/***/ },
/* 310 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _UrlUtility = __webpack_require__(311);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
var _SigninState = __webpack_require__(312);
var _SigninState2 = _interopRequireDefault(_SigninState);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninRequest = function () {
function SigninRequest(_ref) {
var
// mandatory
url = _ref.url;
var client_id = _ref.client_id;
var redirect_uri = _ref.redirect_uri;
var response_type = _ref.response_type;
var scope = _ref.scope;
var authority = _ref.authority;
var
// optional
data = _ref.data;
var prompt = _ref.prompt;
var display = _ref.display;
var max_age = _ref.max_age;
var ui_locales = _ref.ui_locales;
var id_token_hint = _ref.id_token_hint;
var login_hint = _ref.login_hint;
var acr_values = _ref.acr_values;
_classCallCheck(this, SigninRequest);
if (!url) {
_Log2.default.error("No url passed to SigninRequest");
throw new Error("url");
}
if (!client_id) {
_Log2.default.error("No client_id passed to SigninRequest");
throw new Error("client_id");
}
if (!redirect_uri) {
_Log2.default.error("No redirect_uri passed to SigninRequest");
throw new Error("redirect_uri");
}
if (!response_type) {
_Log2.default.error("No response_type passed to SigninRequest");
throw new Error("response_type");
}
if (!scope) {
_Log2.default.error("No scope passed to SigninRequest");
throw new Error("scope");
}
if (!authority) {
_Log2.default.error("No authority passed to SigninRequest");
throw new Error("authority");
}
var oidc = SigninRequest.isOidc(response_type);
this.state = new _SigninState2.default({ nonce: oidc, data: data, client_id: client_id, authority: authority });
url = _UrlUtility2.default.addQueryParam(url, "client_id", client_id);
url = _UrlUtility2.default.addQueryParam(url, "redirect_uri", redirect_uri);
url = _UrlUtility2.default.addQueryParam(url, "response_type", response_type);
url = _UrlUtility2.default.addQueryParam(url, "scope", scope);
url = _UrlUtility2.default.addQueryParam(url, "state", this.state.id);
if (oidc) {
url = _UrlUtility2.default.addQueryParam(url, "nonce", this.state.nonce);
}
var optional = { prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values };
for (var key in optional) {
if (optional[key]) {
url = _UrlUtility2.default.addQueryParam(url, key, optional[key]);
}
}
this.url = url;
}
SigninRequest.isOidc = function isOidc(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "id_token";
});
return !!result[0];
};
SigninRequest.isOAuth = function isOAuth(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "token";
});
return !!result[0];
};
return SigninRequest;
}();
exports.default = SigninRequest;
module.exports = exports['default'];
/***/ },
/* 311 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _Global = __webpack_require__(297);
var _Global2 = _interopRequireDefault(_Global);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UrlUtility = function () {
function UrlUtility() {
_classCallCheck(this, UrlUtility);
}
UrlUtility.addQueryParam = function addQueryParam(url, name, value) {
if (url.indexOf('?') < 0) {
url += "?";
}
if (url[url.length - 1] !== "?") {
url += "&";
}
url += encodeURIComponent(name);
url += "=";
url += encodeURIComponent(value);
return url;
};
UrlUtility.parseUrlFragment = function parseUrlFragment(value) {
var delimiter = arguments.length <= 1 || arguments[1] === undefined ? "#" : arguments[1];
var global = arguments.length <= 2 || arguments[2] === undefined ? _Global2.default : arguments[2];
_Log2.default.info("UrlUtility.parseUrlFragment");
if (typeof value !== 'string') {
value = global.location.href;
}
var idx = value.lastIndexOf(delimiter);
if (idx >= 0) {
value = value.substr(idx + 1);
}
var params = {},
regex = /([^&=]+)=([^&]*)/g,
m;
var counter = 0;
while (m = regex.exec(value)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
if (counter++ > 50) {
_Log2.default.error("response exceeded expected number of parameters", value);
return {
error: "Response exceeded expected number of parameters"
};
}
}
for (var prop in params) {
return params;
}
return {};
};
return UrlUtility;
}();
exports.default = UrlUtility;
module.exports = exports['default'];
/***/ },
/* 312 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _State2 = __webpack_require__(313);
var _State3 = _interopRequireDefault(_State2);
var _random = __webpack_require__(314);
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninState = function (_State) {
_inherits(SigninState, _State);
function SigninState() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var nonce = _ref.nonce;
var authority = _ref.authority;
var client_id = _ref.client_id;
_classCallCheck(this, SigninState);
var _this = _possibleConstructorReturn(this, _State.call(this, arguments[0]));
if (nonce === true) {
_this._nonce = (0, _random2.default)();
} else if (nonce) {
_this._nonce = nonce;
}
_this._authority = authority;
_this._client_id = client_id;
return _this;
}
SigninState.prototype.toStorageString = function toStorageString() {
_Log2.default.info("SigninState.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created,
nonce: this.nonce,
authority: this.authority,
client_id: this.client_id
});
};
SigninState.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("SigninState.fromStorageString");
var data = JSON.parse(storageString);
return new SigninState(data);
};
_createClass(SigninState, [{
key: 'nonce',
get: function get() {
return this._nonce;
}
}, {
key: 'authority',
get: function get() {
return this._authority;
}
}, {
key: 'client_id',
get: function get() {
return this._client_id;
}
}]);
return SigninState;
}(_State3.default);
exports.default = SigninState;
module.exports = exports['default'];
/***/ },
/* 313 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _random = __webpack_require__(314);
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var State = function () {
function State() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var id = _ref.id;
var data = _ref.data;
var created = _ref.created;
_classCallCheck(this, State);
this._id = id || (0, _random2.default)();
this._data = data;
if (typeof created === 'number' && created > 0) {
this._created = created;
} else {
this._created = parseInt(Date.now() / 1000);
}
}
State.prototype.toStorageString = function toStorageString() {
_Log2.default.info("State.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created
});
};
State.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("State.fromStorageString");
return new State(JSON.parse(storageString));
};
State.clearStaleState = function clearStaleState(storage, age) {
_Log2.default.info("State.clearStaleState");
var cutoff = Date.now() / 1000 - age;
return storage.getAllKeys().then(function (keys) {
_Log2.default.info("got keys", keys);
var promises = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
var _loop = function _loop() {
var key = _step.value;
p = storage.get(key).then(function (item) {
var remove = false;
if (item) {
try {
var state = State.fromStorageString(item);
_Log2.default.info("got item from key: ", key, state.created);
if (state.created <= cutoff) {
remove = true;
}
} catch (e) {
_Log2.default.error("Error parsing state for key", key, e.message);
remove = true;
}
} else {
_Log2.default.info("no item in storage for key: ", key);
remove = true;
}
if (remove) {
_Log2.default.info("removed item for key: ", key);
return storage.remove(key);
}
});
promises.push(p);
};
for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var p;
_loop();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
_Log2.default.info("waiting on promise count:", promises.length);
return Promise.all(promises);
});
};
_createClass(State, [{
key: 'id',
get: function get() {
return this._id;
}
}, {
key: 'data',
get: function get() {
return this._data;
}
}, {
key: 'created',
get: function get() {
return this._created;
}
}]);
return State;
}();
exports.default = State;
module.exports = exports['default'];
/***/ },
/* 314 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = random;
//----------------------------------------------------------------------
// AdalJS v1.0.8
// @preserve Copyright (c) Microsoft Open Technologies, Inc.
// All Rights Reserved
// Apache License 2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//----------------------------------------------------------------------
// NOTICE: the code in this file originally developed by Microsoft
// original source: https://github.com/AzureAD/azure-activedirectory-library-for-js/blob/master/lib/adal.js#L1029
function random() {
var guidHolder = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx';
var hex = '0123456789abcdef';
var r = 0;
var guidResponse = "";
for (var i = 0; i < guidHolder.length; i++) {
if (guidHolder[i] !== '-' && guidHolder[i] !== '4') {
// each x and y needs to be random
r = Math.random() * 16 | 0;
}
if (guidHolder[i] === 'x') {
guidResponse += hex[r];
} else if (guidHolder[i] === 'y') {
// clock-seq-and-reserved first hex is filtered and remaining hex values are random
r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
r |= 0x8; // set pos 3 to 1 as 1???
guidResponse += hex[r];
} else {
guidResponse += guidHolder[i];
}
}
return guidResponse;
}
module.exports = exports['default'];
/***/ },
/* 315 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _UrlUtility = __webpack_require__(311);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcScope = "openid";
var SigninResponse = function () {
function SigninResponse(url) {
_classCallCheck(this, SigninResponse);
var values = _UrlUtility2.default.parseUrlFragment(url, "#");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
this.id_token = values.id_token;
this.session_state = values.session_state;
this.access_token = values.access_token;
this.token_type = values.token_type;
this.scope = values.scope;
this.profile = undefined; // will be set from ResponseValidator
var expires_in = parseInt(values.expires_in);
if (typeof expires_in === 'number' && expires_in > 0) {
var now = parseInt(Date.now() / 1000);
this.expires_at = now + expires_in;
}
}
_createClass(SigninResponse, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}, {
key: "isOpenIdConnect",
get: function get() {
return this.scopes.indexOf(OidcScope) >= 0;
}
}]);
return SigninResponse;
}();
exports.default = SigninResponse;
module.exports = exports['default'];
/***/ },
/* 316 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _UrlUtility = __webpack_require__(311);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
var _State = __webpack_require__(313);
var _State2 = _interopRequireDefault(_State);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutRequest = function SignoutRequest(_ref) {
var url = _ref.url;
var id_token_hint = _ref.id_token_hint;
var post_logout_redirect_uri = _ref.post_logout_redirect_uri;
var data = _ref.data;
_classCallCheck(this, SignoutRequest);
if (!url) {
_Log2.default.error("No url passed to SignoutRequest");
throw new Error("url");
}
if (id_token_hint) {
url = _UrlUtility2.default.addQueryParam(url, "id_token_hint", id_token_hint);
if (post_logout_redirect_uri) {
url = _UrlUtility2.default.addQueryParam(url, "post_logout_redirect_uri", post_logout_redirect_uri);
if (data) {
this.state = new _State2.default({ data: data });
url = _UrlUtility2.default.addQueryParam(url, "state", this.state.id);
}
}
}
this.url = url;
};
exports.default = SignoutRequest;
module.exports = exports['default'];
/***/ },
/* 317 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _UrlUtility = __webpack_require__(311);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutResponse = function SignoutResponse(url) {
_classCallCheck(this, SignoutResponse);
var values = _UrlUtility2.default.parseUrlFragment(url, "?");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
};
exports.default = SignoutResponse;
module.exports = exports['default'];
/***/ },
/* 318 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var InMemoryWebStorage = function () {
function InMemoryWebStorage() {
_classCallCheck(this, InMemoryWebStorage);
this._data = {};
}
InMemoryWebStorage.prototype.getItem = function getItem(key) {
_Log2.default.info("InMemoryWebStorage.getItem", key);
return this._data[key];
};
InMemoryWebStorage.prototype.setItem = function setItem(key, value) {
_Log2.default.info("InMemoryWebStorage.setItem", key);
this._data[key] = value;
};
InMemoryWebStorage.prototype.removeItem = function removeItem(key) {
_Log2.default.info("InMemoryWebStorage.removeItem", key);
delete this._data[key];
};
InMemoryWebStorage.prototype.key = function key(index) {
return Object.getOwnPropertyNames(this._data)[index];
};
_createClass(InMemoryWebStorage, [{
key: "length",
get: function get() {
return Object.getOwnPropertyNames(this._data).length;
}
}]);
return InMemoryWebStorage;
}();
exports.default = InMemoryWebStorage;
module.exports = exports['default'];
/***/ },
/* 319 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _OidcClient2 = __webpack_require__(294);
var _OidcClient3 = _interopRequireDefault(_OidcClient2);
var _UserManagerSettings = __webpack_require__(320);
var _UserManagerSettings2 = _interopRequireDefault(_UserManagerSettings);
var _User = __webpack_require__(326);
var _User2 = _interopRequireDefault(_User);
var _UserManagerEvents = __webpack_require__(327);
var _UserManagerEvents2 = _interopRequireDefault(_UserManagerEvents);
var _SilentRenewService = __webpack_require__(331);
var _SilentRenewService2 = _interopRequireDefault(_SilentRenewService);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManager = function (_OidcClient) {
_inherits(UserManager, _OidcClient);
function UserManager() {
var settings = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, UserManager);
if (!(settings instanceof _UserManagerSettings2.default)) {
settings = new _UserManagerSettings2.default(settings);
}
var _this = _possibleConstructorReturn(this, _OidcClient.call(this, settings));
_this._events = new _UserManagerEvents2.default(settings);
if (_this.settings.automaticSilentRenew) {
_Log2.default.info("automaticSilentRenew is configured, setting up silent renew");
_this._silentRenewService = new _SilentRenewService2.default(_this);
}
return _this;
}
UserManager.prototype.getUser = function getUser() {
var _this2 = this;
_Log2.default.info("UserManager.getUser");
return this._loadUser().then(function (user) {
if (user) {
_Log2.default.info("user loaded");
_this2._events.load(user);
return user;
} else {
_Log2.default.info("user not found in storage");
return null;
}
});
};
UserManager.prototype.removeUser = function removeUser() {
var _this3 = this;
_Log2.default.info("UserManager.removeUser");
return this._storeUser(null).then(function () {
_Log2.default.info("user removed from storage");
_this3._events.unload();
});
};
UserManager.prototype.signinPopup = function signinPopup() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signinPopup");
var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri;
if (!url) {
_Log2.default.error("No popup_redirect_uri or redirect_uri configured");
return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured"));
}
args.redirect_uri = url;
args.display = "popup";
return this._signin(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
});
};
UserManager.prototype.signinPopupCallback = function signinPopupCallback(url) {
_Log2.default.info("UserManager.signinPopupCallback");
return this._signinCallback(url, this._popupNavigator);
};
UserManager.prototype.signinSilent = function signinSilent() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signinSilent");
var url = args.redirect_uri || this.settings.silent_redirect_uri;
if (!url) {
_Log2.default.error("No silent_redirect_uri configured");
return Promise.reject(new Error("No silent_redirect_uri configured"));
}
args.redirect_uri = url;
args.prompt = "none";
return this._signin(args, this._iframeNavigator);
};
UserManager.prototype.signinSilentCallback = function signinSilentCallback(url) {
_Log2.default.info("UserManager.signinSilentCallback");
return this._signinCallback(url, this._iframeNavigator);
};
UserManager.prototype._signin = function _signin(args, navigator) {
var _this4 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signin");
return this._signinStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this4._signinEnd(navResponse.url);
});
};
UserManager.prototype._signinCallback = function _signinCallback(url, navigator) {
_Log2.default.info("_signinCallback");
return navigator.callback(url);
};
UserManager.prototype._signout = function _signout(args, navigator) {
var _this5 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signout");
return this._signoutStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this5._signoutEnd(navResponse.url);
});
};
UserManager.prototype._signoutCallback = function _signoutCallback(url, navigator) {
_Log2.default.info("_signoutCallback");
return navigator.callback(url);
};
UserManager.prototype.signinRedirect = function signinRedirect(args) {
_Log2.default.info("UserManager.signinRedirect");
return this._signinStart(args, this._redirectNavigator);
};
UserManager.prototype.signinRedirectCallback = function signinRedirectCallback(url) {
_Log2.default.info("UserManager.signinRedirectCallback");
return this._signinEnd(url || this._redirectNavigator.url);
};
UserManager.prototype.signoutRedirect = function signoutRedirect(args) {
_Log2.default.info("UserManager.signoutRedirect");
return this._signoutStart(args, this._redirectNavigator);
};
UserManager.prototype.signoutRedirectCallback = function signoutRedirectCallback(url) {
_Log2.default.info("UserManager.signoutRedirectCallback");
return this._signoutEnd(url || this._redirectNavigator.url);
};
UserManager.prototype._signinStart = function _signinStart(args, navigator) {
var _this6 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signinStart");
return navigator.prepare(navigatorParams).then(function (handle) {
_Log2.default.info("got navigator window handle");
return _this6.createSigninRequest(args).then(function (signinRequest) {
_Log2.default.info("got signin request");
navigatorParams.url = signinRequest.url;
return handle.navigate(navigatorParams);
});
});
};
UserManager.prototype._signinEnd = function _signinEnd(url) {
var _this7 = this;
_Log2.default.info("_signinEnd");
return this.processSigninResponse(url).then(function (signinResponse) {
_Log2.default.info("got signin response");
var user = new _User2.default(signinResponse);
return _this7._storeUser(user).then(function () {
_Log2.default.info("user stored");
_this7._events.load(user);
return user;
});
});
};
UserManager.prototype._signoutStart = function _signoutStart() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _this8 = this;
var navigator = arguments[1];
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signoutStart");
return navigator.prepare(navigatorParams).then(function (handle) {
_Log2.default.info("got navigator window handle");
return _this8.getUser().then(function (user) {
_Log2.default.info("loaded current user from storage");
var id_token = args.id_token_hint || user && user.id_token;
if (id_token) {
_Log2.default.info("Setting id_token into signout request");
args.id_token_hint = id_token;
}
return _this8.removeUser().then(function () {
_Log2.default.info("user removed, creating signout request");
return _this8.createSignoutRequest(args).then(function (signoutRequest) {
_Log2.default.info("got signout request");
navigatorParams.url = signoutRequest.url;
return handle.navigate(navigatorParams);
});
});
});
});
};
UserManager.prototype._signoutEnd = function _signoutEnd(url) {
_Log2.default.info("_signoutEnd");
return this.processSignoutResponse(url).then(function (signoutResponse) {
_Log2.default.info("got signout response");
return signoutResponse;
});
};
UserManager.prototype._loadUser = function _loadUser() {
_Log2.default.info("_loadUser");
return this._userStore.get(this._userStoreKey).then(function (storageString) {
if (storageString) {
_Log2.default.info("user storageString loaded");
return _User2.default.fromStorageString(storageString);
}
_Log2.default.info("no user storageString");
return null;
});
};
UserManager.prototype._storeUser = function _storeUser(user) {
if (user) {
_Log2.default.info("_storeUser storing user");
var storageString = user.toStorageString();
return this._userStore.set(this._userStoreKey, storageString);
} else {
_Log2.default.info("_storeUser removing user storage");
return this._userStore.remove(this._userStoreKey);
}
};
_createClass(UserManager, [{
key: '_redirectNavigator',
get: function get() {
return this.settings.redirectNavigator;
}
}, {
key: '_popupNavigator',
get: function get() {
return this.settings.popupNavigator;
}
}, {
key: '_iframeNavigator',
get: function get() {
return this.settings.iframeNavigator;
}
}, {
key: '_userStore',
get: function get() {
return this.settings.userStore;
}
}, {
key: 'events',
get: function get() {
return this._events;
}
}, {
key: '_userStoreKey',
get: function get() {
return 'user:' + this.settings.authority + ':' + this.settings.client_id;
}
}]);
return UserManager;
}(_OidcClient3.default);
exports.default = UserManager;
module.exports = exports['default'];
/***/ },
/* 320 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _OidcClientSettings2 = __webpack_require__(295);
var _OidcClientSettings3 = _interopRequireDefault(_OidcClientSettings2);
var _RedirectNavigator = __webpack_require__(321);
var _RedirectNavigator2 = _interopRequireDefault(_RedirectNavigator);
var _PopupNavigator = __webpack_require__(322);
var _PopupNavigator2 = _interopRequireDefault(_PopupNavigator);
var _IFrameNavigator = __webpack_require__(324);
var _IFrameNavigator2 = _interopRequireDefault(_IFrameNavigator);
var _WebStorageStateStore = __webpack_require__(296);
var _WebStorageStateStore2 = _interopRequireDefault(_WebStorageStateStore);
var _Global = __webpack_require__(297);
var _Global2 = _interopRequireDefault(_Global);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var UserManagerSettings = function (_OidcClientSettings) {
_inherits(UserManagerSettings, _OidcClientSettings);
function UserManagerSettings() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var popup_redirect_uri = _ref.popup_redirect_uri;
var popupWindowFeatures = _ref.popupWindowFeatures;
var popupWindowTarget = _ref.popupWindowTarget;
var silent_redirect_uri = _ref.silent_redirect_uri;
var _ref$automaticSilentR = _ref.automaticSilentRenew;
var automaticSilentRenew = _ref$automaticSilentR === undefined ? false : _ref$automaticSilentR;
var _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime;
var accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir;
var _ref$redirectNavigato = _ref.redirectNavigator;
var redirectNavigator = _ref$redirectNavigato === undefined ? new _RedirectNavigator2.default() : _ref$redirectNavigato;
var _ref$popupNavigator = _ref.popupNavigator;
var popupNavigator = _ref$popupNavigator === undefined ? new _PopupNavigator2.default() : _ref$popupNavigator;
var _ref$iframeNavigator = _ref.iframeNavigator;
var iframeNavigator = _ref$iframeNavigator === undefined ? new _IFrameNavigator2.default() : _ref$iframeNavigator;
var _ref$userStore = _ref.userStore;
var userStore = _ref$userStore === undefined ? new _WebStorageStateStore2.default({ store: _Global2.default.sessionStorage }) : _ref$userStore;
_classCallCheck(this, UserManagerSettings);
var _this = _possibleConstructorReturn(this, _OidcClientSettings.call(this, arguments[0]));
_this._popup_redirect_uri = popup_redirect_uri;
_this._popupWindowFeatures = popupWindowFeatures;
_this._popupWindowTarget = popupWindowTarget;
_this._silent_redirect_uri = silent_redirect_uri;
_this._automaticSilentRenew = !!automaticSilentRenew;
_this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
_this._redirectNavigator = redirectNavigator;
_this._popupNavigator = popupNavigator;
_this._iframeNavigator = iframeNavigator;
_this._userStore = userStore;
return _this;
}
_createClass(UserManagerSettings, [{
key: 'popup_redirect_uri',
get: function get() {
return this._popup_redirect_uri;
}
}, {
key: 'popupWindowFeatures',
get: function get() {
return this._popupWindowFeatures;
}
}, {
key: 'popupWindowTarget',
get: function get() {
return this._popupWindowTarget;
}
}, {
key: 'silent_redirect_uri',
get: function get() {
return this._silent_redirect_uri;
}
}, {
key: 'automaticSilentRenew',
get: function get() {
return !!(this.silent_redirect_uri && this._automaticSilentRenew);
}
}, {
key: 'accessTokenExpiringNotificationTime',
get: function get() {
return this._accessTokenExpiringNotificationTime;
}
}, {
key: 'redirectNavigator',
get: function get() {
return this._redirectNavigator;
}
}, {
key: 'popupNavigator',
get: function get() {
return this._popupNavigator;
}
}, {
key: 'iframeNavigator',
get: function get() {
return this._iframeNavigator;
}
}, {
key: 'userStore',
get: function get() {
return this._userStore;
}
}]);
return UserManagerSettings;
}(_OidcClientSettings3.default);
exports.default = UserManagerSettings;
module.exports = exports['default'];
/***/ },
/* 321 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var RedirectNavigator = function () {
function RedirectNavigator() {
_classCallCheck(this, RedirectNavigator);
}
RedirectNavigator.prototype.prepare = function prepare() {
return Promise.resolve(this);
};
RedirectNavigator.prototype.navigate = function navigate(params) {
_Log2.default.info("RedirectNavigator.navigate");
if (!params || !params.url) {
_Log2.default.error("No url provided");
return Promise.reject(new Error("No url provided"));
}
window.location = params.url;
return Promise.resolve();
};
_createClass(RedirectNavigator, [{
key: "url",
get: function get() {
_Log2.default.info("RedirectNavigator.url");
return window.location.href;
}
}]);
return RedirectNavigator;
}();
exports.default = RedirectNavigator;
module.exports = exports['default'];
/***/ },
/* 322 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _PopupWindow = __webpack_require__(323);
var _PopupWindow2 = _interopRequireDefault(_PopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var PopupNavigator = function () {
function PopupNavigator() {
_classCallCheck(this, PopupNavigator);
}
PopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _PopupWindow2.default(params);
return Promise.resolve(popup);
};
PopupNavigator.prototype.callback = function callback(url) {
_Log2.default.info("PopupNavigator.callback");
try {
_PopupWindow2.default.notifyOpener(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return PopupNavigator;
}();
exports.default = PopupNavigator;
module.exports = exports['default'];
/***/ },
/* 323 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var CheckForPopupClosedInterval = 500;
var DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100';
var DefaultPopupTarget = "_blank";
var PopupWindow = function () {
function PopupWindow(params) {
var _this = this;
_classCallCheck(this, PopupWindow);
_Log2.default.info("PopupWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
var features = params.popupWindowFeatures || DefaultPopupFeatures;
var target = params.popupWindowTarget || DefaultPopupTarget;
this._popup = window.open('', target, features);
if (this._popup) {
_Log2.default.info("popup successfully created");
this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval);
}
}
PopupWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("PopupWindow.navigate");
if (!this._popup) {
this._error("Error opening popup window");
} else if (!params || !params.url) {
this._error("No url provided");
} else {
_Log2.default.info("Setting URL in popup");
this._popup.focus();
this._popup.window.location = params.url;
}
return this.promise;
};
PopupWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from popup window");
this._resolve(data);
};
PopupWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
PopupWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("PopupWindow._cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearInterval(this._checkForPopupClosedTimer);
this._checkForPopupClosedTimer = null;
this._boundMessageEventssage = null;
if (this._popup) {
this._popup.close();
}
this._popup = null;
};
PopupWindow.prototype._checkForPopupClosed = function _checkForPopupClosed() {
_Log2.default.info("PopupWindow._checkForPopupClosed");
if (!this._popup || this._popup.closed) {
this._error("Popup window closed");
}
};
PopupWindow.prototype._message = function _message(e) {
_Log2.default.info("PopupWindow._message");
if (e.origin === this._origin && e.source === this._popup.window) {
_Log2.default.info("processing message");
var url = e.data || e.source.location.href; // for IE9
this._cleanup();
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from popup");
}
}
};
PopupWindow.notifyOpener = function notifyOpener(url) {
_Log2.default.info("PopupWindow.notifyOpener");
if (window.opener) {
url = url || window.location.href;
if (url) {
_Log2.default.info("posting url message to opener");
window.opener.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(PopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}, {
key: '_origin',
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return PopupWindow;
}();
exports.default = PopupWindow;
module.exports = exports['default'];
/***/ },
/* 324 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _IFrameWindow = __webpack_require__(325);
var _IFrameWindow2 = _interopRequireDefault(_IFrameWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var IFrameNavigator = function () {
function IFrameNavigator() {
_classCallCheck(this, IFrameNavigator);
}
IFrameNavigator.prototype.prepare = function prepare() {
var frame = new _IFrameWindow2.default();
return Promise.resolve(frame);
};
IFrameNavigator.prototype.callback = function callback(url) {
_Log2.default.info("IFrameNavigator.callback");
try {
_IFrameWindow2.default.notifyParent(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return IFrameNavigator;
}();
exports.default = IFrameNavigator;
module.exports = exports['default'];
/***/ },
/* 325 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultTimeout = 5000;
var IFrameWindow = function () {
function IFrameWindow() {
var _this = this;
_classCallCheck(this, IFrameWindow);
_Log2.default.info("IFrameWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
this._frame = window.document.createElement("iframe");
this._frame.style.display = "none";
window.document.body.appendChild(this._frame);
}
IFrameWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("IFrameWindow.navigate");
if (!params || !params.url) {
this._error("No url provided");
} else {
this._timer = window.setTimeout(this._timeout.bind(this), DefaultTimeout);
this._frame.src = params.url;
}
return this.promise;
};
IFrameWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from frame window");
this._resolve(data);
};
IFrameWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
IFrameWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("IFrameWindow._cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearTimeout(this._timer);
window.document.body.removeChild(this._frame);
this._timer = null;
this._frame = null;
this._boundMessageEventssage = null;
};
IFrameWindow.prototype._timeout = function _timeout() {
_Log2.default.info("IFrameWindow._timeout");
this._error("Frame window timed out");
};
IFrameWindow.prototype._message = function _message(e) {
_Log2.default.info("IFrameWindow._message");
if (this._timer && e.origin === this._origin && e.source === this._frame.contentWindow) {
var url = e.data;
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from frame");
}
}
};
IFrameWindow.notifyParent = function notifyParent(url) {
_Log2.default.info("IFrameWindow.notifyParent");
if (window.parent && window !== window.parent) {
url = url || window.location.href;
if (url) {
_Log2.default.info("posting url message to parent");
window.parent.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(IFrameWindow, [{
key: "promise",
get: function get() {
return this._promise;
}
}, {
key: "_origin",
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return IFrameWindow;
}();
exports.default = IFrameWindow;
module.exports = exports['default'];
/***/ },
/* 326 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var User = function () {
function User(_ref) {
var id_token = _ref.id_token;
var session_state = _ref.session_state;
var access_token = _ref.access_token;
var token_type = _ref.token_type;
var scope = _ref.scope;
var profile = _ref.profile;
var expires_at = _ref.expires_at;
var state = _ref.state;
_classCallCheck(this, User);
this.id_token = id_token;
this.session_state = session_state;
this.access_token = access_token;
this.token_type = token_type;
this.scope = scope;
this.profile = profile;
this.expires_at = expires_at;
this.state = state;
}
User.prototype.toStorageString = function toStorageString() {
_Log2.default.info("User.toStorageString");
return JSON.stringify({
id_token: this.id_token,
session_state: this.session_state,
access_token: this.access_token,
token_type: this.token_type,
scope: this.scope,
profile: this.profile,
expires_at: this.expires_at
});
};
User.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("User.fromStorageString");
return new User(JSON.parse(storageString));
};
_createClass(User, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}]);
return User;
}();
exports.default = User;
module.exports = exports['default'];
/***/ },
/* 327 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _AccessTokenEvents2 = __webpack_require__(328);
var _AccessTokenEvents3 = _interopRequireDefault(_AccessTokenEvents2);
var _Event = __webpack_require__(330);
var _Event2 = _interopRequireDefault(_Event);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManagerEvents = function (_AccessTokenEvents) {
_inherits(UserManagerEvents, _AccessTokenEvents);
function UserManagerEvents(settings) {
_classCallCheck(this, UserManagerEvents);
var _this = _possibleConstructorReturn(this, _AccessTokenEvents.call(this, settings));
_this._userLoaded = new _Event2.default("User loaded");
_this._userUnloaded = new _Event2.default("User unloaded");
_this._silentRenewError = new _Event2.default("Silent renew error");
return _this;
}
UserManagerEvents.prototype.load = function load(user) {
_Log2.default.info("UserManagerEvents.load");
_AccessTokenEvents.prototype.load.call(this, user);
this._userLoaded.raise(user);
};
UserManagerEvents.prototype.unload = function unload() {
_Log2.default.info("UserManagerEvents.unload");
_AccessTokenEvents.prototype.unload.call(this);
this._userUnloaded.raise();
};
UserManagerEvents.prototype.addUserLoaded = function addUserLoaded(cb) {
this._userLoaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserLoaded = function removeUserLoaded(cb) {
this._userLoaded.removeHandler(cb);
};
UserManagerEvents.prototype.addUserUnloaded = function addUserUnloaded(cb) {
this._userUnloaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserUnloaded = function removeUserUnloaded(cb) {
this._userUnloaded.removeHandler(cb);
};
UserManagerEvents.prototype.addSilentRenewError = function addSilentRenewError(cb) {
this._silentRenewError.addHandler(cb);
};
UserManagerEvents.prototype.removeSilentRenewError = function removeSilentRenewError(cb) {
this._silentRenewError.removeHandler(cb);
};
UserManagerEvents.prototype._raiseSilentRenewError = function _raiseSilentRenewError(e) {
_Log2.default.info("UserManagerEvents._raiseSilentRenewError", e.message);
this._silentRenewError.raise(e);
};
return UserManagerEvents;
}(_AccessTokenEvents3.default);
exports.default = UserManagerEvents;
module.exports = exports['default'];
/***/ },
/* 328 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _Timer = __webpack_require__(329);
var _Timer2 = _interopRequireDefault(_Timer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var AccessTokenEvents = function () {
function AccessTokenEvents() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime;
var accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir;
var _ref$accessTokenExpir2 = _ref.accessTokenExpiringTimer;
var accessTokenExpiringTimer = _ref$accessTokenExpir2 === undefined ? new _Timer2.default("Access token expiring") : _ref$accessTokenExpir2;
var _ref$accessTokenExpir3 = _ref.accessTokenExpiredTimer;
var accessTokenExpiredTimer = _ref$accessTokenExpir3 === undefined ? new _Timer2.default("Access token expired") : _ref$accessTokenExpir3;
_classCallCheck(this, AccessTokenEvents);
this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
this._accessTokenExpiring = accessTokenExpiringTimer;
this._accessTokenExpired = accessTokenExpiredTimer;
}
AccessTokenEvents.prototype.load = function load(container) {
_Log2.default.info("AccessTokenEvents.load");
this._cancelTimers();
// only register events if there's an access token where we care about expiration
if (container.access_token) {
var duration = container.expires_in;
_Log2.default.info("access token present, remaining duration:", duration);
if (duration > 0) {
// only register expiring if we still have time
var expiring = duration - this._accessTokenExpiringNotificationTime;
if (expiring <= 0) {
expiring = 1;
}
_Log2.default.info("registering expiring timer in:", expiring);
this._accessTokenExpiring.init(expiring);
}
// always register expired. if it's negative, it will still fire
var expired = duration + 1;
_Log2.default.info("registering expired timer in:", expired);
this._accessTokenExpired.init(expired);
}
};
AccessTokenEvents.prototype.unload = function unload() {
_Log2.default.info("AccessTokenEvents.unload");
this._cancelTimers();
};
AccessTokenEvents.prototype._cancelTimers = function _cancelTimers() {
_Log2.default.info("canceling existing access token timers");
this._accessTokenExpiring.cancel();
this._accessTokenExpired.cancel();
};
AccessTokenEvents.prototype.addAccessTokenExpiring = function addAccessTokenExpiring(cb) {
this._accessTokenExpiring.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpiring = function removeAccessTokenExpiring(cb) {
this._accessTokenExpiring.removeHandler(cb);
};
AccessTokenEvents.prototype.addAccessTokenExpired = function addAccessTokenExpired(cb) {
this._accessTokenExpired.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpired = function removeAccessTokenExpired(cb) {
this._accessTokenExpired.removeHandler(cb);
};
return AccessTokenEvents;
}();
exports.default = AccessTokenEvents;
module.exports = exports['default'];
/***/ },
/* 329 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
var _Global = __webpack_require__(297);
var _Global2 = _interopRequireDefault(_Global);
var _Event2 = __webpack_require__(330);
var _Event3 = _interopRequireDefault(_Event2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Timer = function (_Event) {
_inherits(Timer, _Event);
function Timer(name) {
var timer = arguments.length <= 1 || arguments[1] === undefined ? _Global2.default.timer : arguments[1];
_classCallCheck(this, Timer);
var _this = _possibleConstructorReturn(this, _Event.call(this, name));
_this._timer = timer;
return _this;
}
Timer.prototype.init = function init(duration) {
this.cancel();
if (duration <= 0) {
duration = 1;
}
this._timerHandle = this._timer.setTimeout(this._callback.bind(this), duration * 1000);
};
Timer.prototype.cancel = function cancel() {
if (this._timerHandle) {
this._timer.clearTimeout(this._timerHandle);
this._timerHandle = null;
}
};
Timer.prototype._callback = function _callback() {
this._timerHandle = null;
_Event.prototype.raise.call(this);
};
return Timer;
}(_Event3.default);
exports.default = Timer;
module.exports = exports['default'];
/***/ },
/* 330 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Event = function () {
function Event(name) {
_classCallCheck(this, Event);
this._name = name;
this._callbacks = [];
}
Event.prototype.addHandler = function addHandler(cb) {
this._callbacks.push(cb);
};
Event.prototype.removeHandler = function removeHandler(cb) {
var idx = this._callbacks.findIndex(function (item) {
return item === cb;
});
if (idx >= 0) {
this._callbacks.splice(idx, 1);
}
};
Event.prototype.raise = function raise() {
_Log2.default.info("Raising event: " + this._name);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = this._callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var cb = _step.value;
cb.apply(undefined, arguments);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
};
return Event;
}();
exports.default = Event;
module.exports = exports['default'];
/***/ },
/* 331 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(293);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SilentRenewService = function () {
function SilentRenewService(userManager) {
_classCallCheck(this, SilentRenewService);
this._userManager = userManager;
this._userManager.events.addAccessTokenExpiring(this._tokenExpiring.bind(this));
}
SilentRenewService.prototype._tokenExpiring = function _tokenExpiring() {
var _this = this;
_Log2.default.info("SilentRenewService automatically renewing access token");
this._userManager.signinSilent().then(function (user) {
_Log2.default.info("Silent token renewal successful");
}, function (err) {
_Log2.default.error("Error from signinSilent:", err.message);
_this._userManager.events._raiseSilentRenewError(err);
});
};
return SilentRenewService;
}();
exports.default = SilentRenewService;
module.exports = exports['default'];
/***/ }
/******/ ]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZGExZjNjZmI3M2M0ZTUyMzM4YmEiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19rZXlvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy13cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYS1udW1iZXItdmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXJlcGVhdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zaWduLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1leHBtMS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmh5cG90LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmF3LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtcmVnZXhwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvbWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZXZlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstbWFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLXNldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYnVmZmVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX293bi1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcuYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcGFkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLWdldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLWdldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktZnJvbS1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LmVycm9yLmlzLWVycm9yLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgudW11bGguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3BhcnRpYWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9iYWJlbC1yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLnJlZ2V4cC5lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVwbGFjZXIuanMiLCJ3ZWJwYWNrOi8vLy4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0xvZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvT2lkY0NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvR2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9SZXNwb25zZVZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Kc29uU2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlckluZm9TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9FcnJvclJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Kb3NlVXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2pzcnNhc2lnbi9saWIvanNyc2FzaWduLmpzIiwid2VicGFjazovLy8od2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9iYXNlNjQtanMvbGliL2I2NC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovLy8od2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VybFV0aWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblN0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9TdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmFuZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWduaW5SZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25vdXRSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSW5NZW1vcnlXZWJTdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Qb3B1cFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvSUZyYW1lTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0V2ZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9TaWxlbnRSZW5ld1NlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7OztBQy9CRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Qzs7Ozs7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXNCO0FBQ3RCLHFCQUFvQix1QkFBdUIsU0FBUyxJQUFJO0FBQ3hELElBQUc7QUFDSCxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ3hCRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ2hCRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNQRDtBQUNBOztBQUVBLDZCQUE0QixnQ0FBZ0MsRTs7Ozs7O0FDSDVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1BEO0FBQ0E7O0FBRUEsNkJBQTRCLCtCQUE4QixFOzs7Ozs7QUNIMUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ2REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDWEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDUEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxFQUFDLEU7Ozs7OztBQ3RCRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUMsRTs7Ozs7O0FDakJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDTkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQTZC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QztBQUNEO0FBQ0E7QUFDQSw0RkFBMkY7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsRUFBQzs7QUFFRCx3Qzs7Ozs7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHOzs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPLFdBQVc7QUFDbEI7QUFDQTtBQUNBLFFBQU8sVUFBVTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU8sV0FBVztBQUNsQjtBQUNBO0FBQ0E7QUFDQSxRQUFPLFdBQVc7QUFDbEI7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUF5QixnQkFBZ0IsdUJBQXVCLEdBQUc7QUFDbkU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBZ0IsV0FBVztBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0gsRUFBQztBQUNEO0FBQ0Esc0JBQXFCO0FBQ3JCLElBQUc7QUFDSCwwQkFBeUI7QUFDekIsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWdELGlCQUFpQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQzs7Ozs7O0FDbFJBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDSEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ0pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBLDZCQUE0QjtBQUM1QixJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFpQixnQkFBZ0IsMEJBQTBCLEdBQUc7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF3RCxnQ0FBZ0M7QUFDeEY7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLDZFQUE0RSxZQUFZO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXVELDZDQUE2QyxFQUFFOztBQUV0RztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsa0RBQWlEO0FBQ2pEO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsb0NBQW1DO0FBQ25DO0FBQ0EsTUFBSztBQUNMLHVFQUFzRTtBQUN0RTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMLDZEQUE0RDtBQUM1RDtBQUNBLE1BQUs7QUFDTCx1RUFBc0U7QUFDdEU7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVILHVCQUFzQixzQkFBc0IsRUFBRSxFQUFFO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQStCLGFBQWE7QUFDNUM7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CLDBCQUEwQjtBQUM5QyxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLDRCQUEyQjtBQUMzQiw0QkFBMkI7QUFDM0IsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBd0IsYUFBYTtBQUNyQyxRQUFPO0FBQ1A7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMOztBQUVBOztBQUVBOztBQUVBLHdEQUF1RCxVQUFVOztBQUVqRTs7QUFFQSw2RkFBNEYsd0JBQXdCOztBQUVwSDtBQUNBO0FBQ0EsTUFBSyxVQUFVLGNBQWM7O0FBRTdCO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxNQUFLLFdBQVcsZ0NBQWdDOztBQUVoRDtBQUNBO0FBQ0E7QUFDQSxFQUFDLGtDQUFrQyxlOzs7Ozs7QUNoZW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHOzs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDSkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLFE7Ozs7OztBQ0pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNKRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDSkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ0pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNKRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDSkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ0pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDUkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBeUM7QUFDekMsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ3JDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBZ0MsTUFBTSxTQUFTLE9BQU8sU0FBUztBQUMvRCxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNyQkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUErQjtBQUMvQixlQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXNDO0FBQ3RDLElBQUc7QUFDSCxXQUFVO0FBQ1YsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDekJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQStCLFNBQVMsRTs7Ozs7O0FDcEJ4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1ZEO0FBQ0E7O0FBRUEsZ0NBQStCLGtDQUFnQyxFOzs7Ozs7QUNIL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRzs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDZkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUErQixTQUFTLEU7Ozs7OztBQzlCeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ2REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRCxzQzs7Ozs7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNURDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsZTs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxhOzs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFVO0FBQ1YsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDN0JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNsQkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNSRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEc7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDUkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMEMsNkRBQTZEO0FBQ3ZHO0FBQ0EsRUFBQyxFOzs7Ozs7QUNYRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE0QyxhQUFhO0FBQ3pEO0FBQ0EsRUFBQyxFOzs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEwQyw2REFBNkQ7QUFDdkc7QUFDQSxFQUFDLEU7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsRUFBQyxFOzs7Ozs7QUNqQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxFQUFDLEU7Ozs7OztBQ2pCRDtBQUNBOztBQUVBLHdDQUF1Qyx3Q0FBZ0QsRTs7Ozs7O0FDSHZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHOzs7Ozs7QUNSQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDTkE7QUFDQTs7QUFFQSx3Q0FBdUMsd0NBQWdELEU7Ozs7OztBQ0h2RjtBQUNBOztBQUVBLCtCQUE4QiwrQkFBNkIsRTs7Ozs7O0FDSDNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDUkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ2ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNmRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFjO0FBQ2Q7QUFDQSxHQUFFLEU7Ozs7OztBQ1BGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUFzRCxnQkFBZ0IsRUFBRTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEc7Ozs7OztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsRTs7Ozs7O0FDZEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFjO0FBQ2Q7QUFDQSxHQUFFLEU7Ozs7OztBQ2hCRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFjO0FBQ2Q7QUFDQSxHQUFFLEU7Ozs7OztBQ2xCRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFjO0FBQ2Q7QUFDQTtBQUNBLEdBQUUsRTs7Ozs7O0FDUkY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBYztBQUNkO0FBQ0EsR0FBRSxFOzs7Ozs7QUNQRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFjO0FBQ2Q7QUFDQSxHQUFFLEU7Ozs7OztBQ2ZGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWM7QUFDZDtBQUNBO0FBQ0EsR0FBRSxFOzs7Ozs7QUNSRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsRTs7Ozs7O0FDZEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXFFO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNuQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsRzs7Ozs7O0FDdEJBLHlDOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNMRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUdBQXdHLE9BQU87QUFDL0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFOzs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBYztBQUNkLE1BQUs7QUFDTCxlQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTBDLFdBQVc7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBOztBQUVBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBLGFBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYTtBQUNiO0FBQ0E7O0FBRUEsWUFBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxZQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQSwrQ0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsTUFB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QTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQzVWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWdCLG9DQUFvQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFnRCxFQUFFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBbUIsNkJBQTZCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0Esb0JBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQSxnQkFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsbUJBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0Esb0JBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLHdDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBaUIsWUFBWTtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFD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WUFBTCxDQUFrQixNQUFsQixDQUF5QixzQkFBekIsQ0FBZ0QsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQWhEO0FBQ0g7O2tDQUVELGMsNkJBQWlCO0FBQUE7O0FBQ2IsdUJBQUksSUFBSixDQUFTLHdEQUFUOztBQUVBLGNBQUssWUFBTCxDQUFrQixZQUFsQixHQUFpQyxJQUFqQyxDQUFzQyxnQkFBUTtBQUMxQywyQkFBSSxJQUFKLENBQVMsaUNBQVQ7QUFDSCxVQUZELEVBRUcsZUFBTztBQUNOLDJCQUFJLEtBQUosQ0FBVSwwQkFBVixFQUFzQyxJQUFJLE9BQTFDO0FBQ0EsbUJBQUssWUFBTCxDQUFrQixNQUFsQixDQUF5QixzQkFBekIsQ0FBZ0QsR0FBaEQ7QUFDSCxVQUxEO0FBTUgsTTs7Ozs7bUJBaEJnQixrQiIsImZpbGUiOiJvaWRjLWNsaWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgZGExZjNjZmI3M2M0ZTUyMzM4YmFcbiAqKi8iLCIvKiBlc2xpbnQgbWF4LWxlbjogMCAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvc2hpbVwiKTtcblxucmVxdWlyZShcImJhYmVsLXJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG5cbi8vIFNob3VsZCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2U6XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGVcIik7XG5cbmlmIChnbG9iYWwuX2JhYmVsUG9seWZpbGwpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgaW5zdGFuY2Ugb2YgYmFiZWwtcG9seWZpbGwgaXMgYWxsb3dlZFwiKTtcbn1cbmdsb2JhbC5fYmFiZWxQb2x5ZmlsbCA9IHRydWU7XG5cbnZhciBERUZJTkVfUFJPUEVSVFkgPSBcImRlZmluZVByb3BlcnR5XCI7XG5mdW5jdGlvbiBkZWZpbmUoTywga2V5LCB2YWx1ZSkge1xuICBPW2tleV0gfHwgT2JqZWN0W0RFRklORV9QUk9QRVJUWV0oTywga2V5LCB7XG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9KTtcbn1cblxuZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIFwicGFkTGVmdFwiLCBcIlwiLnBhZFN0YXJ0KTtcbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZFJpZ2h0XCIsIFwiXCIucGFkRW5kKTtcblxuXCJwb3AscmV2ZXJzZSxzaGlmdCxrZXlzLHZhbHVlcyxlbnRyaWVzLGluZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXMsam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLHJlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGxcIi5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIFtdW2tleV0gJiYgZGVmaW5lKEFycmF5LCBrZXksIEZ1bmN0aW9uLmNhbGwuYmluZChbXVtrZXldKSk7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNicnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jbHozMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5leHBtMScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaW11bCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy50cmltJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS5ub3cnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29ydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZXZlcnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5oYXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pYWRkaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC51bXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21vZHVsZXMvX2NvcmUnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvc2hpbS5qc1xuICoqIG1vZHVsZSBpZCA9IDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgREVTQ1JJUFRPUlMgICAgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIE1FVEEgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWVxuICAsICRmYWlscyAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIHNoYXJlZCAgICAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCB1aWQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgd2tzICAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi9fa2V5b2YnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJylcbiAgLCBpc0FycmF5ICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLWFycmF5JylcbiAgLCBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBfY3JlYXRlICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGdPUE5FeHQgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JylcbiAgLCAkR09QRCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJylcbiAgLCAkRFAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG4gICwgZFAgICAgICAgICAgICAgPSAkRFAuZlxuICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG4gICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG4gICwgJEpTT04gICAgICAgICAgPSBnbG9iYWwuSlNPTlxuICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG4gICwgc2V0dGVyICAgICAgICAgPSBmYWxzZVxuICAsIFBST1RPVFlQRSAgICAgID0gJ3Byb3RvdHlwZSdcbiAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG4gICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcbiAgLCBpc0VudW0gICAgICAgICA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlXG4gICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG4gICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuICAsIE9iamVjdFByb3RvICAgID0gT2JqZWN0W1BST1RPVFlQRV1cbiAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcbiAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZihwcm90b0Rlc2MpZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICBERVNDUklQVE9SUyAmJiBzZXR0ZXIgJiYgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkpKXtcbiAgICBpZighRC5lbnVtZXJhYmxlKXtcbiAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHtlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKX0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSlcbiAgICAsIGkgICAgPSAwXG4gICAgLCBsID0ga2V5cy5sZW5ndGhcbiAgICAsIGtleTtcbiAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICB2YXIgRCA9IGdPUEQoaXQgPSB0b0lPYmplY3QoaXQpLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICB2YXIgbmFtZXMgID0gZ09QTih0b0lPYmplY3QoaXQpKVxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGkgICAgICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG4gIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KXtcbiAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gIHZhciBhcmdzID0gW2l0XVxuICAgICwgaSAgICA9IDFcbiAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gIHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG4gIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICBpZigkcmVwbGFjZXIpdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcbiAgfTtcbiAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG59O1xudmFyIEJVR0dZX0pTT04gPSAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSk7XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYoIVVTRV9OQVRJVkUpe1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCl7XG4gICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgcmV0dXJuIHdyYXAodWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKSk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiAgPSAkcHJvcGVydHlJc0VudW1lcmFibGVcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZihERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKXtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cbi8vIDE5LjQuMi4yIFN5bWJvbC5oYXNJbnN0YW5jZVxuLy8gMTkuNC4yLjMgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZVxuLy8gMTkuNC4yLjQgU3ltYm9sLml0ZXJhdG9yXG4vLyAxOS40LjIuNiBTeW1ib2wubWF0Y2hcbi8vIDE5LjQuMi44IFN5bWJvbC5yZXBsYWNlXG4vLyAxOS40LjIuOSBTeW1ib2wuc2VhcmNoXG4vLyAxOS40LjIuMTAgU3ltYm9sLnNwZWNpZXNcbi8vIDE5LjQuMi4xMSBTeW1ib2wuc3BsaXRcbi8vIDE5LjQuMi4xMiBTeW1ib2wudG9QcmltaXRpdmVcbi8vIDE5LjQuMi4xMyBTeW1ib2wudG9TdHJpbmdUYWdcbi8vIDE5LjQuMi4xNCBTeW1ib2wudW5zY29wYWJsZXNcbmZvcih2YXIgc3ltYm9scyA9IChcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApe1xuICB2YXIga2V5ICAgICA9IHN5bWJvbHNbaSsrXVxuICAgICwgV3JhcHBlciA9IGNvcmUuU3ltYm9sXG4gICAgLCBzeW0gICAgID0gd2tzKGtleSk7XG4gIGlmKCEoa2V5IGluIFdyYXBwZXIpKWRQKFdyYXBwZXIsIGtleSwge3ZhbHVlOiBVU0VfTkFUSVZFID8gc3ltIDogd3JhcChzeW0pfSk7XG59O1xuXG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbmlmKCFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQpc2V0dGVyID0gdHJ1ZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbihrZXkpe1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioa2V5KXtcbiAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcbiAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8IEJVR0dZX0pTT04pLCAnSlNPTicsIHtzdHJpbmdpZnk6ICRzdHJpbmdpZnl9KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zeW1ib2wuanNcbiAqKiBtb2R1bGUgaWQgPSAzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qc1xuICoqIG1vZHVsZSBpZCA9IDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuMi4yJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29yZS5qc1xuICoqIG1vZHVsZSBpZCA9IDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oYXMuanNcbiAqKiBtb2R1bGUgaWQgPSA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanNcbiAqKiBtb2R1bGUgaWQgPSA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanNcbiAqKiBtb2R1bGUgaWQgPSA4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZSAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSlcbiAgICAsIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQpcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZihJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dClleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzXG4gKiogbW9kdWxlIGlkID0gMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qc1xuICoqIG1vZHVsZSBpZCA9IDExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanNcbiAqKiBtb2R1bGUgaWQgPSAxN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBTUkMgICAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJylcbiAgLCBUT19TVFJJTkcgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXVxuICAsIFRQTCAgICAgICA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYoT1trZXldID09PSB2YWwpcmV0dXJuO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZihPID09PSBnbG9iYWwpe1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBpZighc2FmZSl7XG4gICAgICBkZWxldGUgT1trZXldO1xuICAgICAgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKE9ba2V5XSlPW2tleV0gPSB2YWw7XG4gICAgICBlbHNlIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLmpzXG4gKiogbW9kdWxlIGlkID0gMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL191aWQuanNcbiAqKiBtb2R1bGUgaWQgPSAxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzXG4gKiogbW9kdWxlIGlkID0gMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBNRVRBICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJylcbiAgLCBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaGFzICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHNldERlc2MgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGlkICAgICAgID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uKGl0KXtcbiAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfX0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24oaXQsIGNyZWF0ZSl7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG4gIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogICAgICBNRVRBLFxuICBORUVEOiAgICAgZmFsc2UsXG4gIGZhc3RLZXk6ICBmYXN0S2V5LFxuICBnZXRXZWFrOiAgZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tZXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDIzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG4gIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzXG4gKiogbW9kdWxlIGlkID0gMjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzXG4gKiogbW9kdWxlIGlkID0gMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGVsKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaW5kZXggID0gMFxuICAgICwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpbmRleClpZihPW2tleSA9IGtleXNbaW5kZXgrK11dID09PSBlbClyZXR1cm4ga2V5O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fa2V5b2YuanNcbiAqKiBtb2R1bGUgaWQgPSAyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXHJcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcclxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xyXG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxyXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXHJcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxyXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcclxuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcclxuICAgICwgaSAgICAgID0gMFxyXG4gICAgLCByZXN1bHQgPSBbXVxyXG4gICAgLCBrZXk7XHJcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xyXG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcclxuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XHJcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1xuICoqIG1vZHVsZSBpZCA9IDI4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvZi5qc1xuICoqIG1vZHVsZSBpZCA9IDMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAzMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDMzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzXG4gKiogbW9kdWxlIGlkID0gMzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDM1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDM2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxyXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcclxuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzXG4gKiogbW9kdWxlIGlkID0gMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcclxubW9kdWxlLmV4cG9ydHMgPSAoXHJcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcclxuKS5zcGxpdCgnLCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BTICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYoZ2V0U3ltYm9scyl7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuICAgICAgLCBpc0VudW0gID0gcElFLmZcbiAgICAgICwgaSAgICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAzOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanNcbiAqKiBtb2R1bGUgaWQgPSA0MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1waWUuanNcbiAqKiBtb2R1bGUgaWQgPSA0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZyl7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSA0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXHJcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXHJcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxyXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJylcclxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXHJcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cclxuICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XHJcblxyXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXHJcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcclxuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xyXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXHJcbiAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxyXG4gICAgLCBndCAgICAgPSAnPidcclxuICAgICwgaWZyYW1lRG9jdW1lbnQ7XHJcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XHJcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxyXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XHJcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xyXG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XHJcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xyXG4gIGlmcmFtZURvY3VtZW50LndyaXRlKCc8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PC9zY3JpcHQnICsgZ3QpO1xyXG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XHJcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XHJcbiAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xyXG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xyXG4gIHZhciByZXN1bHQ7XHJcbiAgaWYoTyAhPT0gbnVsbCl7XHJcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XHJcbiAgICByZXN1bHQgPSBuZXcgRW1wdHk7XHJcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcclxuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcclxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xyXG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XHJcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gNDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXHJcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXHJcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XHJcbiAgYW5PYmplY3QoTyk7XHJcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcclxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcclxuICAgICwgaSA9IDBcclxuICAgICwgUDtcclxuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XHJcbiAgcmV0dXJuIE87XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanNcbiAqKiBtb2R1bGUgaWQgPSA0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanNcbiAqKiBtb2R1bGUgaWQgPSA0NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGdPUE4gICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanNcbiAqKiBtb2R1bGUgaWQgPSA0NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxyXG52YXIgJGtleXMgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcclxuICAsIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XHJcblxyXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xyXG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanNcbiAqKiBtb2R1bGUgaWQgPSA0N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHBJRSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXHJcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxyXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcclxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcclxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxyXG4gICwgZ09QRCAgICAgICAgICAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG5cclxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XHJcbiAgTyA9IHRvSU9iamVjdChPKTtcclxuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XHJcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcclxuICAgIHJldHVybiBnT1BEKE8sIFApO1xyXG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cclxuICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qc1xuICoqIG1vZHVsZSBpZCA9IDQ4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzXG4gKiogbW9kdWxlIGlkID0gNDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXHJcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2NyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSA1MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcclxuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcclxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzXG4gKiogbW9kdWxlIGlkID0gNTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcbi8vIDE5LjEuMi4zIC8gMTUuMi4zLjcgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcclxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19vYmplY3QtZHBzJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzXG4gKiogbW9kdWxlIGlkID0gNTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbigpe1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDUzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjb3JlICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cbiAgICAsIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzXG4gKiogbW9kdWxlIGlkID0gNTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIHRvT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgJGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KXtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSA1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanNcbiAqKiBtb2R1bGUgaWQgPSA1NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcclxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcclxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcclxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXHJcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbihPKXtcclxuICBPID0gdG9PYmplY3QoTyk7XHJcbiAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XHJcbiAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XHJcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XHJcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qc1xuICoqIG1vZHVsZSBpZCA9IDU3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgJGtleXMgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbigpe1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCl7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSA1OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKS5mO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXG4gKiogbW9kdWxlIGlkID0gNTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi41IE9iamVjdC5mcmVlemUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgbWV0YSAgICAgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZnJlZXplJywgZnVuY3Rpb24oJGZyZWV6ZSl7XG4gIHJldHVybiBmdW5jdGlvbiBmcmVlemUoaXQpe1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDYwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTcgT2JqZWN0LnNlYWwoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgbWV0YSAgICAgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnc2VhbCcsIGZ1bmN0aW9uKCRzZWFsKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYWwoaXQpe1xuICAgIHJldHVybiAkc2VhbCAmJiBpc09iamVjdChpdCkgPyAkc2VhbChtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbC5qc1xuICoqIG1vZHVsZSBpZCA9IDYxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIG1ldGEgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24oJHByZXZlbnRFeHRlbnNpb25zKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KXtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zLmpzXG4gKiogbW9kdWxlIGlkID0gNjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24oJGlzRnJvemVuKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRnJvemVuKGl0KXtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuLmpzXG4gKiogbW9kdWxlIGlkID0gNjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi4xMyBPYmplY3QuaXNTZWFsZWQoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzU2VhbGVkJywgZnVuY3Rpb24oJGlzU2VhbGVkKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKGl0KXtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzU2VhbGVkID8gJGlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzXG4gKiogbW9kdWxlIGlkID0gNjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi4xMSBPYmplY3QuaXNFeHRlbnNpYmxlKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0V4dGVuc2libGUnLCBmdW5jdGlvbigkaXNFeHRlbnNpYmxlKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDY1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7YXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDY2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpXG4gICwgcElFICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCAkYXNzaWduICA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBBID0ge31cbiAgICAsIEIgPSB7fVxuICAgICwgUyA9IFN5bWJvbCgpXG4gICAgLCBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oayl7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgICAgID0gdG9PYmplY3QodGFyZ2V0KVxuICAgICwgYUxlbiAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBpbmRleCA9IDFcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmZcbiAgICAsIGlzRW51bSAgICAgPSBwSUUuZjtcbiAgd2hpbGUoYUxlbiA+IGluZGV4KXtcbiAgICB2YXIgUyAgICAgID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pXG4gICAgICAsIGtleXMgICA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaiAgICAgID0gMFxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUobGVuZ3RoID4gailpZihpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKVRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzXG4gKiogbW9kdWxlIGlkID0gNjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMy4xMCBPYmplY3QuaXModmFsdWUxLCB2YWx1ZTIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7aXM6IHJlcXVpcmUoJy4vX3NhbWUtdmFsdWUnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMuanNcbiAqKiBtb2R1bGUgaWQgPSA2OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4yLjkgU2FtZVZhbHVlKHgsIHkpXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiBpcyh4LCB5KXtcbiAgcmV0dXJuIHggPT09IHkgPyB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSA6IHggIT0geCAmJiB5ICE9IHk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzXG4gKiogbW9kdWxlIGlkID0gNjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7c2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qc1xuICoqIG1vZHVsZSBpZCA9IDcwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbihPLCBwcm90byl7XG4gIGFuT2JqZWN0KE8pO1xuICBpZighaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKXRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uKHRlc3QsIGJ1Z2d5LCBzZXQpe1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2goZSl7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKXtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZihidWdneSlPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qc1xuICoqIG1vZHVsZSBpZCA9IDcxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgdGVzdCAgICA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZih0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKXtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanNcbiAqKiBtb2R1bGUgaWQgPSA3MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qc1xuICoqIG1vZHVsZSBpZCA9IDczXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4yLjMuMiAvIDE1LjMuNC41IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKHRoaXNBcmcsIGFyZ3MuLi4pXHJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0Z1bmN0aW9uJywge2JpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5iaW5kLmpzXG4gKiogbW9kdWxlIGlkID0gNzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgaXNPYmplY3QgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaW52b2tlICAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgYXJyYXlTbGljZSA9IFtdLnNsaWNlXG4gICwgZmFjdG9yaWVzICA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24oRiwgbGVuLCBhcmdzKXtcbiAgaWYoIShsZW4gaW4gZmFjdG9yaWVzKSl7XG4gICAgZm9yKHZhciBuID0gW10sIGkgPSAwOyBpIDwgbGVuOyBpKyspbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qLCBhcmdzLi4uICovKXtcbiAgdmFyIGZuICAgICAgID0gYUZ1bmN0aW9uKHRoaXMpXG4gICAgLCBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbigvKiBhcmdzLi4uICovKXtcbiAgICB2YXIgYXJncyA9IHBhcnRBcmdzLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZCA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgfTtcbiAgaWYoaXNPYmplY3QoZm4ucHJvdG90eXBlKSlib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2JpbmQuanNcbiAqKiBtb2R1bGUgaWQgPSA3NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanNcbiAqKiBtb2R1bGUgaWQgPSA3NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIGhhcyAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIEZQcm90byAgICAgPSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgLCBuYW1lUkUgICAgID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvXG4gICwgTkFNRSAgICAgICA9ICduYW1lJztcbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpe1xuICAgIHZhciBtYXRjaCA9ICgnJyArIHRoaXMpLm1hdGNoKG5hbWVSRSlcbiAgICAgICwgbmFtZSAgPSBtYXRjaCA/IG1hdGNoWzFdIDogJyc7XG4gICAgaGFzKHRoaXMsIE5BTUUpIHx8IGRQKHRoaXMsIE5BTUUsIGNyZWF0ZURlc2MoNSwgbmFtZSkpO1xuICAgIHJldHVybiBuYW1lO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qc1xuICoqIG1vZHVsZSBpZCA9IDc3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgSEFTX0lOU1RBTkNFICAgPSByZXF1aXJlKCcuL193a3MnKSgnaGFzSW5zdGFuY2UnKVxuICAsIEZ1bmN0aW9uUHJvdG8gID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuLy8gMTkuMi4zLjYgRnVuY3Rpb24ucHJvdG90eXBlW0BAaGFzSW5zdGFuY2VdKFYpXG5pZighKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvKSlyZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKEZ1bmN0aW9uUHJvdG8sIEhBU19JTlNUQU5DRSwge3ZhbHVlOiBmdW5jdGlvbihPKXtcbiAgaWYodHlwZW9mIHRoaXMgIT0gJ2Z1bmN0aW9uJyB8fCAhaXNPYmplY3QoTykpcmV0dXJuIGZhbHNlO1xuICBpZighaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKXJldHVybiBPIGluc3RhbmNlb2YgdGhpcztcbiAgLy8gZm9yIGVudmlyb25tZW50IHcvbyBuYXRpdmUgYEBAaGFzSW5zdGFuY2VgIGxvZ2ljIGVub3VnaCBgaW5zdGFuY2VvZmAsIGJ1dCBhZGQgdGhpczpcbiAgd2hpbGUoTyA9IGdldFByb3RvdHlwZU9mKE8pKWlmKHRoaXMucHJvdG90eXBlID09PSBPKXJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qc1xuICoqIG1vZHVsZSBpZCA9IDc4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xyXG4vLyAxOC4yLjUgcGFyc2VJbnQoc3RyaW5nLCByYWRpeClcclxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VJbnQgIT0gJHBhcnNlSW50KSwge3BhcnNlSW50OiAkcGFyc2VJbnR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzXG4gKiogbW9kdWxlIGlkID0gNzlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUludFxuICAsICR0cmltICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbVxuICAsIHdzICAgICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpXG4gICwgaGV4ICAgICAgID0gL15bXFwtK10/MFt4WF0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICRwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3cyArICcweDE2JykgIT09IDIyID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCl7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHJldHVybiAkcGFyc2VJbnQoc3RyaW5nLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzXG4gKiogbW9kdWxlIGlkID0gODBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBzcGFjZXMgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJylcbiAgLCBzcGFjZSAgID0gJ1snICsgc3BhY2VzICsgJ10nXG4gICwgbm9uICAgICA9ICdcXHUyMDBiXFx1MDA4NSdcbiAgLCBsdHJpbSAgID0gUmVnRXhwKCdeJyArIHNwYWNlICsgc3BhY2UgKyAnKicpXG4gICwgcnRyaW0gICA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uKEtFWSwgZXhlYywgQUxJQVMpe1xuICB2YXIgZXhwICAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gISFzcGFjZXNbS0VZXSgpIHx8IG5vbltLRVldKCkgIT0gbm9uO1xuICB9KTtcbiAgdmFyIGZuID0gZXhwW0tFWV0gPSBGT1JDRSA/IGV4ZWModHJpbSkgOiBzcGFjZXNbS0VZXTtcbiAgaWYoQUxJQVMpZXhwW0FMSUFTXSA9IGZuO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFLCAnU3RyaW5nJywgZXhwKTtcbn07XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZXhwb3J0ZXIudHJpbSA9IGZ1bmN0aW9uKHN0cmluZywgVFlQRSl7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZihUWVBFICYgMSlzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpO1xuICBpZihUWVBFICYgMilzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICByZXR1cm4gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlcjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXRyaW0uanNcbiAqKiBtb2R1bGUgaWQgPSA4MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSAnXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDMnICtcclxuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy13cy5qc1xuICoqIG1vZHVsZSBpZCA9IDgyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19wYXJzZS1mbG9hdCcpO1xyXG4vLyAxOC4yLjQgcGFyc2VGbG9hdChzdHJpbmcpXHJcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCB7cGFyc2VGbG9hdDogJHBhcnNlRmxvYXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanNcbiAqKiBtb2R1bGUgaWQgPSA4M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VGbG9hdFxuICAsICR0cmltICAgICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKS50cmltO1xuXG5tb2R1bGUuZXhwb3J0cyA9IDEgLyAkcGFyc2VGbG9hdChyZXF1aXJlKCcuL19zdHJpbmctd3MnKSArICctMCcpICE9PSAtSW5maW5pdHkgPyBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cil7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMylcbiAgICAsIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgc3RyaW5nLmNoYXJBdCgwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiAkcGFyc2VGbG9hdDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtZmxvYXQuanNcbiAqKiBtb2R1bGUgaWQgPSA4NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoYXMgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgY29mICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpXG4gICwgdG9QcmltaXRpdmUgICAgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGZhaWxzICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIGdPUE4gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mXG4gICwgZ09QRCAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmZcbiAgLCBkUCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCAkdHJpbSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbVxuICAsIE5VTUJFUiAgICAgICAgICAgID0gJ051bWJlcidcbiAgLCAkTnVtYmVyICAgICAgICAgICA9IGdsb2JhbFtOVU1CRVJdXG4gICwgQmFzZSAgICAgICAgICAgICAgPSAkTnVtYmVyXG4gICwgcHJvdG8gICAgICAgICAgICAgPSAkTnVtYmVyLnByb3RvdHlwZVxuICAvLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbiAgLCBCUk9LRU5fQ09GICAgICAgICA9IGNvZihyZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykocHJvdG8pKSA9PSBOVU1CRVJcbiAgLCBUUklNICAgICAgICAgICAgICA9ICd0cmltJyBpbiBTdHJpbmcucHJvdG90eXBlO1xuXG4vLyA3LjEuMyBUb051bWJlcihhcmd1bWVudClcbnZhciB0b051bWJlciA9IGZ1bmN0aW9uKGFyZ3VtZW50KXtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYodHlwZW9mIGl0ID09ICdzdHJpbmcnICYmIGl0Lmxlbmd0aCA+IDIpe1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApXG4gICAgICAsIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZihmaXJzdCA9PT0gNDMgfHwgZmlyc3QgPT09IDQ1KXtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKXJldHVybiBOYU47IC8vIE51bWJlcignKzB4MScpIHNob3VsZCBiZSBOYU4sIG9sZCBWOCBmaXhcbiAgICB9IGVsc2UgaWYoZmlyc3QgPT09IDQ4KXtcbiAgICAgIHN3aXRjaChpdC5jaGFyQ29kZUF0KDEpKXtcbiAgICAgICAgY2FzZSA2NiA6IGNhc2UgOTggIDogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5IDogY2FzZSAxMTEgOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0IDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvcih2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKyl7XG4gICAgICAgIGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgLy8gcGFyc2VJbnQgcGFyc2VzIGEgc3RyaW5nIHRvIGEgZmlyc3QgdW5hdmFpbGFibGUgc3ltYm9sXG4gICAgICAgIC8vIGJ1dCBUb051bWJlciBzaG91bGQgcmV0dXJuIE5hTiBpZiBhIHN0cmluZyBjb250YWlucyB1bmF2YWlsYWJsZSBzeW1ib2xzXG4gICAgICAgIGlmKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSlyZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZighJE51bWJlcignIDBvMScpIHx8ICEkTnVtYmVyKCcwYjEnKSB8fCAkTnVtYmVyKCcrMHgxJykpe1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKXtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZVxuICAgICAgLCB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gdGhhdCBpbnN0YW5jZW9mICROdW1iZXJcbiAgICAgIC8vIGNoZWNrIG9uIDEuLmNvbnN0cnVjdG9yKGZvbykgY2FzZVxuICAgICAgJiYgKEJST0tFTl9DT0YgPyBmYWlscyhmdW5jdGlvbigpeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSh0b051bWJlcihpdCkpLCB0aGF0LCAkTnVtYmVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yKHZhciBrZXlzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUE4oQmFzZSkgOiAoXG4gICAgLy8gRVMzOlxuICAgICdNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSwnICtcbiAgICAvLyBFUzYgKGluIGNhc2UsIGlmIG1vZHVsZXMgd2l0aCBFUzYgTnVtYmVyIHN0YXRpY3MgcmVxdWlyZWQgYmVmb3JlKTpcbiAgICAnRVBTSUxPTixpc0Zpbml0ZSxpc0ludGVnZXIsaXNOYU4saXNTYWZlSW50ZWdlcixNQVhfU0FGRV9JTlRFR0VSLCcgK1xuICAgICdNSU5fU0FGRV9JTlRFR0VSLHBhcnNlRmxvYXQscGFyc2VJbnQsaXNJbnRlZ2VyJ1xuICApLnNwbGl0KCcsJyksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajsgaisrKXtcbiAgICBpZihoYXMoQmFzZSwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKXtcbiAgICAgIGRQKCROdW1iZXIsIGtleSwgZ09QRChCYXNlLCBrZXkpKTtcbiAgICB9XG4gIH1cbiAgJE51bWJlci5wcm90b3R5cGUgPSBwcm90bztcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkTnVtYmVyO1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKGdsb2JhbCwgTlVNQkVSLCAkTnVtYmVyKTtcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gODVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXHJcbiAgLCBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldDtcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aGF0LCB0YXJnZXQsIEMpe1xyXG4gIHZhciBQLCBTID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xyXG4gIGlmKFMgIT09IEMgJiYgdHlwZW9mIFMgPT0gJ2Z1bmN0aW9uJyAmJiAoUCA9IFMucHJvdG90eXBlKSAhPT0gQy5wcm90b3R5cGUgJiYgaXNPYmplY3QoUCkgJiYgc2V0UHJvdG90eXBlT2Ype1xyXG4gICAgc2V0UHJvdG90eXBlT2YodGhhdCwgUCk7XHJcbiAgfSByZXR1cm4gdGhhdDtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDg2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgYW5JbnN0YW5jZSAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxyXG4gICwgdG9JbnRlZ2VyICAgID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXHJcbiAgLCBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpXHJcbiAgLCByZXBlYXQgICAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0JylcclxuICAsICR0b0ZpeGVkICAgICA9IDEuLnRvRml4ZWRcclxuICAsIGZsb29yICAgICAgICA9IE1hdGguZmxvb3JcclxuICAsIGRhdGEgICAgICAgICA9IFswLCAwLCAwLCAwLCAwLCAwXVxyXG4gICwgRVJST1IgICAgICAgID0gJ051bWJlci50b0ZpeGVkOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnXHJcbiAgLCBaRVJPICAgICAgICAgPSAnMCc7XHJcblxyXG52YXIgbXVsdGlwbHkgPSBmdW5jdGlvbihuLCBjKXtcclxuICB2YXIgaSAgPSAtMVxyXG4gICAgLCBjMiA9IGM7XHJcbiAgd2hpbGUoKytpIDwgNil7XHJcbiAgICBjMiArPSBuICogZGF0YVtpXTtcclxuICAgIGRhdGFbaV0gPSBjMiAlIDFlNztcclxuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xyXG4gIH1cclxufTtcclxudmFyIGRpdmlkZSA9IGZ1bmN0aW9uKG4pe1xyXG4gIHZhciBpID0gNlxyXG4gICAgLCBjID0gMDtcclxuICB3aGlsZSgtLWkgPj0gMCl7XHJcbiAgICBjICs9IGRhdGFbaV07XHJcbiAgICBkYXRhW2ldID0gZmxvb3IoYyAvIG4pO1xyXG4gICAgYyA9IChjICUgbikgKiAxZTc7XHJcbiAgfVxyXG59O1xyXG52YXIgbnVtVG9TdHJpbmcgPSBmdW5jdGlvbigpe1xyXG4gIHZhciBpID0gNlxyXG4gICAgLCBzID0gJyc7XHJcbiAgd2hpbGUoLS1pID49IDApe1xyXG4gICAgaWYocyAhPT0gJycgfHwgaSA9PT0gMCB8fCBkYXRhW2ldICE9PSAwKXtcclxuICAgICAgdmFyIHQgPSBTdHJpbmcoZGF0YVtpXSk7XHJcbiAgICAgIHMgPSBzID09PSAnJyA/IHQgOiBzICsgcmVwZWF0LmNhbGwoWkVSTywgNyAtIHQubGVuZ3RoKSArIHQ7XHJcbiAgICB9XHJcbiAgfSByZXR1cm4gcztcclxufTtcclxudmFyIHBvdyA9IGZ1bmN0aW9uKHgsIG4sIGFjYyl7XHJcbiAgcmV0dXJuIG4gPT09IDAgPyBhY2MgOiBuICUgMiA9PT0gMSA/IHBvdyh4LCBuIC0gMSwgYWNjICogeCkgOiBwb3coeCAqIHgsIG4gLyAyLCBhY2MpO1xyXG59O1xyXG52YXIgbG9nID0gZnVuY3Rpb24oeCl7XHJcbiAgdmFyIG4gID0gMFxyXG4gICAgLCB4MiA9IHg7XHJcbiAgd2hpbGUoeDIgPj0gNDA5Nil7XHJcbiAgICBuICs9IDEyO1xyXG4gICAgeDIgLz0gNDA5NjtcclxuICB9XHJcbiAgd2hpbGUoeDIgPj0gMil7XHJcbiAgICBuICArPSAxO1xyXG4gICAgeDIgLz0gMjtcclxuICB9IHJldHVybiBuO1xyXG59O1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoISEkdG9GaXhlZCAmJiAoXHJcbiAgMC4wMDAwOC50b0ZpeGVkKDMpICE9PSAnMC4wMDAnIHx8XHJcbiAgMC45LnRvRml4ZWQoMCkgIT09ICcxJyB8fFxyXG4gIDEuMjU1LnRvRml4ZWQoMikgIT09ICcxLjI1JyB8fFxyXG4gIDEwMDAwMDAwMDAwMDAwMDAxMjguLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4J1xyXG4pIHx8ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XHJcbiAgLy8gVjggfiBBbmRyb2lkIDQuMy1cclxuICAkdG9GaXhlZC5jYWxsKHt9KTtcclxufSkpLCAnTnVtYmVyJywge1xyXG4gIHRvRml4ZWQ6IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpe1xyXG4gICAgdmFyIHggPSBhTnVtYmVyVmFsdWUodGhpcywgRVJST1IpXHJcbiAgICAgICwgZiA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cylcclxuICAgICAgLCBzID0gJydcclxuICAgICAgLCBtID0gWkVST1xyXG4gICAgICAsIGUsIHosIGosIGs7XHJcbiAgICBpZihmIDwgMCB8fCBmID4gMjApdGhyb3cgUmFuZ2VFcnJvcihFUlJPUik7XHJcbiAgICBpZih4ICE9IHgpcmV0dXJuICdOYU4nO1xyXG4gICAgaWYoeCA8PSAtMWUyMSB8fCB4ID49IDFlMjEpcmV0dXJuIFN0cmluZyh4KTtcclxuICAgIGlmKHggPCAwKXtcclxuICAgICAgcyA9ICctJztcclxuICAgICAgeCA9IC14O1xyXG4gICAgfVxyXG4gICAgaWYoeCA+IDFlLTIxKXtcclxuICAgICAgZSA9IGxvZyh4ICogcG93KDIsIDY5LCAxKSkgLSA2OTtcclxuICAgICAgeiA9IGUgPCAwID8geCAqIHBvdygyLCAtZSwgMSkgOiB4IC8gcG93KDIsIGUsIDEpO1xyXG4gICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7XHJcbiAgICAgIGUgPSA1MiAtIGU7XHJcbiAgICAgIGlmKGUgPiAwKXtcclxuICAgICAgICBtdWx0aXBseSgwLCB6KTtcclxuICAgICAgICBqID0gZjtcclxuICAgICAgICB3aGlsZShqID49IDcpe1xyXG4gICAgICAgICAgbXVsdGlwbHkoMWU3LCAwKTtcclxuICAgICAgICAgIGogLT0gNztcclxuICAgICAgICB9XHJcbiAgICAgICAgbXVsdGlwbHkocG93KDEwLCBqLCAxKSwgMCk7XHJcbiAgICAgICAgaiA9IGUgLSAxO1xyXG4gICAgICAgIHdoaWxlKGogPj0gMjMpe1xyXG4gICAgICAgICAgZGl2aWRlKDEgPDwgMjMpO1xyXG4gICAgICAgICAgaiAtPSAyMztcclxuICAgICAgICB9XHJcbiAgICAgICAgZGl2aWRlKDEgPDwgaik7XHJcbiAgICAgICAgbXVsdGlwbHkoMSwgMSk7XHJcbiAgICAgICAgZGl2aWRlKDIpO1xyXG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xyXG4gICAgICAgIG11bHRpcGx5KDEgPDwgLWUsIDApO1xyXG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpICsgcmVwZWF0LmNhbGwoWkVSTywgZik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKGYgPiAwKXtcclxuICAgICAgayA9IG0ubGVuZ3RoO1xyXG4gICAgICBtID0gcyArIChrIDw9IGYgPyAnMC4nICsgcmVwZWF0LmNhbGwoWkVSTywgZiAtIGspICsgbSA6IG0uc2xpY2UoMCwgayAtIGYpICsgJy4nICsgbS5zbGljZShrIC0gZikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbSA9IHMgKyBtO1xyXG4gICAgfSByZXR1cm4gbTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQuanNcbiAqKiBtb2R1bGUgaWQgPSA4N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKXtcbiAgaWYoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpe1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanNcbiAqKiBtb2R1bGUgaWQgPSA4OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBtc2cpe1xyXG4gIGlmKHR5cGVvZiBpdCAhPSAnbnVtYmVyJyAmJiBjb2YoaXQpICE9ICdOdW1iZXInKXRocm93IFR5cGVFcnJvcihtc2cpO1xyXG4gIHJldHVybiAraXQ7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2EtbnVtYmVyLXZhbHVlLmpzXG4gKiogbW9kdWxlIGlkID0gODlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVwZWF0KGNvdW50KXtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKVxuICAgICwgcmVzID0gJydcbiAgICAsIG4gICA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpdGhyb3cgUmFuZ2VFcnJvcihcIkNvdW50IGNhbid0IGJlIG5lZ2F0aXZlXCIpO1xuICBmb3IoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSlpZihuICYgMSlyZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXJlcGVhdC5qc1xuICoqIG1vZHVsZSBpZCA9IDkwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJGZhaWxzICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxyXG4gICwgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKVxyXG4gICwgJHRvUHJlY2lzaW9uID0gMS4udG9QcmVjaXNpb247XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICgkZmFpbHMoZnVuY3Rpb24oKXtcclxuICAvLyBJRTctXHJcbiAgcmV0dXJuICR0b1ByZWNpc2lvbi5jYWxsKDEsIHVuZGVmaW5lZCkgIT09ICcxJztcclxufSkgfHwgISRmYWlscyhmdW5jdGlvbigpe1xyXG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXHJcbiAgJHRvUHJlY2lzaW9uLmNhbGwoe30pO1xyXG59KSksICdOdW1iZXInLCB7XHJcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbil7XHJcbiAgICB2YXIgdGhhdCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCAnTnVtYmVyI3RvUHJlY2lzaW9uOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcclxuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQpIDogJHRvUHJlY2lzaW9uLmNhbGwodGhhdCwgcHJlY2lzaW9uKTsgXHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDkxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7RVBTSUxPTjogTWF0aC5wb3coMiwgLTUyKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDkyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4xLjIuMiBOdW1iZXIuaXNGaW5pdGUobnVtYmVyKVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgX2lzRmluaXRlID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUoaXQpe1xuICAgIHJldHVybiB0eXBlb2YgaXQgPT0gJ251bWJlcicgJiYgX2lzRmluaXRlKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanNcbiAqKiBtb2R1bGUgaWQgPSA5M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtpc0ludGVnZXI6IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDk0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpe1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSA5NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjQgTnVtYmVyLmlzTmFOKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKXtcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4uanNcbiAqKiBtb2R1bGUgaWQgPSA5NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpXG4gICwgYWJzICAgICAgID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcil7XG4gICAgcmV0dXJuIGlzSW50ZWdlcihudW1iZXIpICYmIGFicyhudW1iZXIpIDw9IDB4MWZmZmZmZmZmZmZmZmY7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gOTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtNQVhfU0FGRV9JTlRFR0VSOiAweDFmZmZmZmZmZmZmZmZmfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gOThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi4xMCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7TUlOX1NBRkVfSU5URUdFUjogLTB4MWZmZmZmZmZmZmZmZmZ9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSA5OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywge3BhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHtwYXJzZUludDogJHBhcnNlSW50fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBsb2cxcCAgID0gcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpXG4gICwgc3FydCAgICA9IE1hdGguc3FydFxuICAsICRhY29zaCAgPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTiBcbiAgJiYgJGFjb3NoKEluZmluaXR5KSA9PSBJbmZpbml0eVxuKSwgJ01hdGgnLCB7XG4gIGFjb3NoOiBmdW5jdGlvbiBhY29zaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYWNvc2guanNcbiAqKiBtb2R1bGUgaWQgPSAxMDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtbG9nMXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi41IE1hdGguYXNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkYXNpbmggID0gTWF0aC5hc2luaDtcblxuZnVuY3Rpb24gYXNpbmgoeCl7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFzaW5oKDApIC0+IC0wIFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhc2luaCAmJiAxIC8gJGFzaW5oKDApID4gMCksICdNYXRoJywge2FzaW5oOiBhc2luaH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oLmpzXG4gKiogbW9kdWxlIGlkID0gMTA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGF0YW5oICA9IE1hdGguYXRhbmg7XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hdGFuaCgtMCkgLT4gMCBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXRhbmggJiYgMSAvICRhdGFuaCgtMCkgPCAwKSwgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2lnbiAgICA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCl7XG4gICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIE1hdGgucG93KE1hdGguYWJzKHgpLCAxIC8gMyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDEwN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjExIE1hdGguY2x6MzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2x6MzI6IGZ1bmN0aW9uIGNsejMyKHgpe1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY29zaDogZnVuY3Rpb24gY29zaCh4KXtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzXG4gKiogbW9kdWxlIGlkID0gMTA5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRleHBtMSAgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCRleHBtMSAhPSBNYXRoLmV4cG0xKSwgJ01hdGgnLCB7ZXhwbTE6ICRleHBtMX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xLmpzXG4gKiogbW9kdWxlIGlkID0gMTEwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBtMSA9IE1hdGguZXhwbTE7XG5tb2R1bGUuZXhwb3J0cyA9ICghJGV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgJGV4cG0xKDEwKSA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCAkZXhwbTEoMTApIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OFxuICAvLyBUb3IgQnJvd3NlciBidWdcbiAgfHwgJGV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBNYXRoLmV4cCh4KSAtIDE7XG59IDogJGV4cG0xO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG0xLmpzXG4gKiogbW9kdWxlIGlkID0gMTExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHNpZ24gICAgICA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpXG4gICwgcG93ICAgICAgID0gTWF0aC5wb3dcbiAgLCBFUFNJTE9OICAgPSBwb3coMiwgLTUyKVxuICAsIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpXG4gICwgTUFYMzIgICAgID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMilcbiAgLCBNSU4zMiAgICAgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKyAxIC8gRVBTSUxPTiAtIDEgLyBFUFNJTE9OO1xufTtcblxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGZyb3VuZDogZnVuY3Rpb24gZnJvdW5kKHgpe1xuICAgIHZhciAkYWJzICA9IE1hdGguYWJzKHgpXG4gICAgICAsICRzaWduID0gc2lnbih4KVxuICAgICAgLCBhLCByZXN1bHQ7XG4gICAgaWYoJGFicyA8IE1JTjMyKXJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gICAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzO1xuICAgIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpO1xuICAgIGlmKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpcmV0dXJuICRzaWduICogSW5maW5pdHk7XG4gICAgcmV0dXJuICRzaWduICogcmVzdWx0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xNyBNYXRoLmh5cG90KFt2YWx1ZTFbLCB2YWx1ZTJbLCDigKYgXV1dKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGFicyAgICAgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN1bSAgPSAwXG4gICAgICAsIGkgICAgPSAwXG4gICAgICAsIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIGxhcmcgPSAwXG4gICAgICAsIGFyZywgZGl2O1xuICAgIHdoaWxlKGkgPCBhTGVuKXtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZihsYXJnIDwgYXJnKXtcbiAgICAgICAgZGl2ICA9IGxhcmcgLyBhcmc7XG4gICAgICAgIHN1bSAgPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmKGFyZyA+IDApe1xuICAgICAgICBkaXYgID0gYXJnIC8gbGFyZztcbiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjtcbiAgICAgIH0gZWxzZSBzdW0gKz0gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBNYXRoLnNxcnQoc3VtKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xOCBNYXRoLmltdWwoeCwgeSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkaW11bCAgID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiAkaW11bCgweGZmZmZmZmZmLCA1KSAhPSAtNSB8fCAkaW11bC5sZW5ndGggIT0gMjtcbn0pLCAnTWF0aCcsIHtcbiAgaW11bDogZnVuY3Rpb24gaW11bCh4LCB5KXtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmXG4gICAgICAsIHhuID0gK3hcbiAgICAgICwgeW4gPSAreVxuICAgICAgLCB4bCA9IFVJTlQxNiAmIHhuXG4gICAgICAsIHlsID0gVUlOVDE2ICYgeW47XG4gICAgcmV0dXJuIDAgfCB4bCAqIHlsICsgKChVSU5UMTYgJiB4biA+Pj4gMTYpICogeWwgKyB4bCAqIChVSU5UMTYgJiB5biA+Pj4gMTYpIDw8IDE2ID4+PiAwKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qc1xuICoqIG1vZHVsZSBpZCA9IDExNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7bG9nMXA6IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwLmpzXG4gKiogbW9kdWxlIGlkID0gMTE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCl7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjI7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzIuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtzaWduOiByZXF1aXJlKCcuL19tYXRoLXNpZ24nKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSAxMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4zMCBNYXRoLnNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHBtMSAgID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpXG4gICwgZXhwICAgICA9IE1hdGguZXhwO1xuXG4vLyBWOCBuZWFyIENocm9taXVtIDM4IGhhcyBhIHByb2JsZW0gd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KXtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanNcbiAqKiBtb2R1bGUgaWQgPSAxMTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHBtMSAgID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpXG4gICwgZXhwICAgICA9IE1hdGguZXhwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHRhbmg6IGZ1bmN0aW9uIHRhbmgoeCl7XG4gICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpXG4gICAgICAsIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjM0IE1hdGgudHJ1bmMoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KXtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgdG9JbmRleCAgICAgICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICwgZnJvbUNoYXJDb2RlICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlXG4gICwgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgcmVzICA9IFtdXG4gICAgICAsIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIGkgICAgPSAwXG4gICAgICAsIGNvZGU7XG4gICAgd2hpbGUoYUxlbiA+IGkpe1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmKHRvSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKXRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgcmVzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCwgY29kZSAlIDB4NDAwICsgMHhkYzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzXG4gKiogbW9kdWxlIGlkID0gMTIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi40IFN0cmluZy5yYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpXG4gIHJhdzogZnVuY3Rpb24gcmF3KGNhbGxTaXRlKXtcbiAgICB2YXIgdHBsICA9IHRvSU9iamVjdChjYWxsU2l0ZS5yYXcpXG4gICAgICAsIGxlbiAgPSB0b0xlbmd0aCh0cGwubGVuZ3RoKVxuICAgICAgLCBhTGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCByZXMgID0gW11cbiAgICAgICwgaSAgICA9IDA7XG4gICAgd2hpbGUobGVuID4gaSl7XG4gICAgICByZXMucHVzaChTdHJpbmcodHBsW2krK10pKTtcbiAgICAgIGlmKGkgPCBhTGVuKXJlcy5wdXNoKFN0cmluZyhhcmd1bWVudHNbaV0pKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmF3LmpzXG4gKiogbW9kdWxlIGlkID0gMTIzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbigkdHJpbSl7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltKCl7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzXG4gKiogbW9kdWxlIGlkID0gMTI0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qc1xuICoqIG1vZHVsZSBpZCA9IDEyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gMTI5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGF0ICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcyl7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIxLjEuMy42IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgoc2VhcmNoU3RyaW5nIFssIGVuZFBvc2l0aW9uXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgY29udGV4dCAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKVxuICAsIEVORFNfV0lUSCA9ICdlbmRzV2l0aCdcbiAgLCAkZW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyosIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLyl7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgRU5EU19XSVRIKVxuICAgICAgLCBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIGxlbiAgICA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKVxuICAgICAgLCBlbmQgICAgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogTWF0aC5taW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pXG4gICAgICAsIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKXtcbiAgaWYoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSl0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzXG4gKiogbW9kdWxlIGlkID0gMTMyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgY29mICAgICAgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIE1BVENIICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2goZSl7XG4gICAgdHJ5IHtcbiAgICAgIHJlW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICEnLy4vJ1tLRVldKHJlKTtcbiAgICB9IGNhdGNoKGYpeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIxLjEuMy43IFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiA9IDApXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGNvbnRleHQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKVxuICAsIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShJTkNMVURFUyksICdTdHJpbmcnLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyosIHBvc2l0aW9uID0gMCAqLyl7XG4gICAgcmV0dXJuICEhfmNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBJTkNMVURFUylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzXG4gKiogbW9kdWxlIGlkID0gMTM1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIxLjEuMy4xOCBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIFssIHBvc2l0aW9uIF0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBjb250ZXh0ICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0JylcbiAgLCBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJ1xuICAsICRzdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKFNUQVJUU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyosIHBvc2l0aW9uID0gMCAqLyl7XG4gICAgdmFyIHRoYXQgICA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSClcbiAgICAgICwgaW5kZXggID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSlcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRzdGFydHNXaXRoXG4gICAgICA/ICRzdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzXG4gKiogbW9kdWxlIGlkID0gMTM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4yIFN0cmluZy5wcm90b3R5cGUuYW5jaG9yKG5hbWUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdhbmNob3InLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuYW1lKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICduYW1lJywgbmFtZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMTM4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgcXVvdCAgICA9IC9cIi9nO1xuLy8gQi4yLjMuMi4xIENyZWF0ZUhUTUwoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpXG52YXIgY3JlYXRlSFRNTCA9IGZ1bmN0aW9uKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTICA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpXG4gICAgLCBwMSA9ICc8JyArIHRhZztcbiAgaWYoYXR0cmlidXRlICE9PSAnJylwMSArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPVwiJyArIFN0cmluZyh2YWx1ZSkucmVwbGFjZShxdW90LCAnJnF1b3Q7JykgKyAnXCInO1xuICByZXR1cm4gcDEgKyAnPicgKyBTICsgJzwvJyArIHRhZyArICc+Jztcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUsIGV4ZWMpe1xuICB2YXIgTyA9IHt9O1xuICBPW05BTUVdID0gZXhlYyhjcmVhdGVIVE1MKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpe1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMyBTdHJpbmcucHJvdG90eXBlLmJpZygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdiaWcnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJpZygpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiaWcnLCAnJywgJycpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qc1xuICoqIG1vZHVsZSBpZCA9IDE0MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNCBTdHJpbmcucHJvdG90eXBlLmJsaW5rKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JsaW5rJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBibGluaygpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjUgU3RyaW5nLnByb3RvdHlwZS5ib2xkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JvbGQnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvbGQoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYicsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNiBTdHJpbmcucHJvdG90eXBlLmZpeGVkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZpeGVkJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBmaXhlZCgpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjcgU3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3IoY29sb3IpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250Y29sb3InLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRjb2xvcihjb2xvcil7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnY29sb3InLCBjb2xvcik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMTQ0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy44IFN0cmluZy5wcm90b3R5cGUuZm9udHNpemUoc2l6ZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRzaXplJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBmb250c2l6ZShzaXplKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjkgU3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2l0YWxpY3MnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGl0YWxpY3MoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnaScsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcy5qc1xuICoqIG1vZHVsZSBpZCA9IDE0NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTAgU3RyaW5nLnByb3RvdHlwZS5saW5rKHVybClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2xpbmsnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGxpbmsodXJsKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzXG4gKiogbW9kdWxlIGlkID0gMTQ3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMSBTdHJpbmcucHJvdG90eXBlLnNtYWxsKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3NtYWxsJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBzbWFsbCgpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzbWFsbCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEyIFN0cmluZy5wcm90b3R5cGUuc3RyaWtlKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N0cmlrZScsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gc3RyaWtlKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlLmpzXG4gKiogbW9kdWxlIGlkID0gMTQ5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMyBTdHJpbmcucHJvdG90eXBlLnN1YigpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdWInLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN1Yigpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdWInLCAnJywgJycpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qc1xuICoqIG1vZHVsZSBpZCA9IDE1MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5zdXAoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3VwJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBzdXAoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3VwJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlMsICdEYXRlJywge25vdzogZnVuY3Rpb24oKXsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzXG4gKiogbW9kdWxlIGlkID0gMTUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIG5ldyBEYXRlKE5hTikudG9KU09OKCkgIT09IG51bGwgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoe3RvSVNPU3RyaW5nOiBmdW5jdGlvbigpeyByZXR1cm4gMTsgfX0pICE9PSAxO1xufSksICdEYXRlJywge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpe1xuICAgIHZhciBPICA9IHRvT2JqZWN0KHRoaXMpXG4gICAgICAsIHB2ID0gdG9QcmltaXRpdmUoTyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDE1M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG4vLyAyMC4zLjQuMzYgLyAxNS45LjUuNDMgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcoKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxyXG4gICwgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XHJcblxyXG52YXIgbHogPSBmdW5jdGlvbihudW0pe1xyXG4gIHJldHVybiBudW0gPiA5ID8gbnVtIDogJzAnICsgbnVtO1xyXG59O1xyXG5cclxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgcmV0dXJuIG5ldyBEYXRlKC01ZTEzIC0gMSkudG9JU09TdHJpbmcoKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcclxufSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgbmV3IERhdGUoTmFOKS50b0lTT1N0cmluZygpO1xyXG59KSksICdEYXRlJywge1xyXG4gIHRvSVNPU3RyaW5nOiBmdW5jdGlvbiB0b0lTT1N0cmluZygpe1xyXG4gICAgaWYoIWlzRmluaXRlKGdldFRpbWUuY2FsbCh0aGlzKSkpdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XHJcbiAgICB2YXIgZCA9IHRoaXNcclxuICAgICAgLCB5ID0gZC5nZXRVVENGdWxsWWVhcigpXHJcbiAgICAgICwgbSA9IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcclxuICAgICAgLCBzID0geSA8IDAgPyAnLScgOiB5ID4gOTk5OSA/ICcrJyA6ICcnO1xyXG4gICAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xyXG4gICAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXHJcbiAgICAgICdUJyArIGx6KGQuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBseihkLmdldFVUQ01pbnV0ZXMoKSkgK1xyXG4gICAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBEYXRlUHJvdG8gICAgPSBEYXRlLnByb3RvdHlwZVxuICAsIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnXG4gICwgVE9fU1RSSU5HICAgID0gJ3RvU3RyaW5nJ1xuICAsICR0b1N0cmluZyAgICA9IERhdGVQcm90b1tUT19TVFJJTkddXG4gICwgZ2V0VGltZSAgICAgID0gRGF0ZVByb3RvLmdldFRpbWU7XG5pZihuZXcgRGF0ZShOYU4pICsgJycgIT0gSU5WQUxJRF9EQVRFKXtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShEYXRlUHJvdG8sIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/ICR0b1N0cmluZy5jYWxsKHRoaXMpIDogSU5WQUxJRF9EQVRFO1xuICB9KTtcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBUT19QUklNSVRJVkUgPSByZXF1aXJlKCcuL193a3MnKSgndG9QcmltaXRpdmUnKVxyXG4gICwgcHJvdG8gICAgICAgID0gRGF0ZS5wcm90b3R5cGU7XHJcblxyXG5pZighKFRPX1BSSU1JVElWRSBpbiBwcm90bykpcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE1NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxyXG4gICwgTlVNQkVSICAgICAgPSAnbnVtYmVyJztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaGludCl7XHJcbiAgaWYoaGludCAhPT0gJ3N0cmluZycgJiYgaGludCAhPT0gTlVNQkVSICYmIGhpbnQgIT09ICdkZWZhdWx0Jyl0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XHJcbiAgcmV0dXJuIHRvUHJpbWl0aXZlKGFuT2JqZWN0KHRoaXMpLCBoaW50ICE9IE5VTUJFUik7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzXG4gKiogbW9kdWxlIGlkID0gMTU3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHtpc0FycmF5OiByZXF1aXJlKCcuL19pcy1hcnJheScpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMTU4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgdG9MZW5ndGggICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5JylcbiAgLCBnZXRJdGVyRm4gICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIEMgICAgICAgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5XG4gICAgICAsIGFMZW4gICAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIG1hcGZuICAgPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICAgLCBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZFxuICAgICAgLCBpbmRleCAgID0gMFxuICAgICAgLCBpdGVyRm4gID0gZ2V0SXRlckZuKE8pXG4gICAgICAsIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZihtYXBwaW5nKW1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpe1xuICAgICAgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4Kyspe1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvcihyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qc1xuICoqIG1vZHVsZSBpZCA9IDE1OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qc1xuICoqIG1vZHVsZSBpZCA9IDE2MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDE2MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcclxuICAsIGNyZWF0ZURlc2MgICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBpbmRleCwgdmFsdWUpe1xyXG4gIGlmKGluZGV4IGluIG9iamVjdCkkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XHJcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qc1xuICoqIG1vZHVsZSBpZCA9IDE2MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXG4gKiogbW9kdWxlIGlkID0gMTYzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qc1xuICoqIG1vZHVsZSBpZCA9IDE2NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpY1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsIGFMZW4gICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhTGVuKTtcbiAgICB3aGlsZShhTGVuID4gaW5kZXgpY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gYUxlbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanNcbiAqKiBtb2R1bGUgaWQgPSAxNjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5qb2luKHNlcGFyYXRvcilcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIGFycmF5Sm9pbiA9IFtdLmpvaW47XHJcblxyXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2Ugc3RyaW5nc1xyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChyZXF1aXJlKCcuL19pb2JqZWN0JykgIT0gT2JqZWN0IHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoYXJyYXlKb2luKSksICdBcnJheScsIHtcclxuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcil7XHJcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodG9JT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qc1xuICoqIG1vZHVsZSBpZCA9IDE2NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obWV0aG9kLCBhcmcpe1xyXG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbigpe1xyXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24oKXt9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xyXG4gIH0pO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzXG4gKiogbW9kdWxlIGlkID0gMTY3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGh0bWwgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcclxuICAsIGNvZiAgICAgICAgPSByZXF1aXJlKCcuL19jb2YnKVxyXG4gICwgdG9JbmRleCAgICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcclxuICAsIHRvTGVuZ3RoICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxyXG4gICwgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xyXG5cclxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICBpZihodG1sKWFycmF5U2xpY2UuY2FsbChodG1sKTtcclxufSksICdBcnJheScsIHtcclxuICBzbGljZTogZnVuY3Rpb24gc2xpY2UoYmVnaW4sIGVuZCl7XHJcbiAgICB2YXIgbGVuICAgPSB0b0xlbmd0aCh0aGlzLmxlbmd0aClcclxuICAgICAgLCBrbGFzcyA9IGNvZih0aGlzKTtcclxuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kO1xyXG4gICAgaWYoa2xhc3MgPT0gJ0FycmF5JylyZXR1cm4gYXJyYXlTbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpO1xyXG4gICAgdmFyIHN0YXJ0ICA9IHRvSW5kZXgoYmVnaW4sIGxlbilcclxuICAgICAgLCB1cFRvICAgPSB0b0luZGV4KGVuZCwgbGVuKVxyXG4gICAgICAsIHNpemUgICA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydClcclxuICAgICAgLCBjbG9uZWQgPSBBcnJheShzaXplKVxyXG4gICAgICAsIGkgICAgICA9IDA7XHJcbiAgICBmb3IoOyBpIDwgc2l6ZTsgaSsrKWNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXHJcbiAgICAgID8gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKVxyXG4gICAgICA6IHRoaXNbc3RhcnQgKyBpXTtcclxuICAgIHJldHVybiBjbG9uZWQ7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNjhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsIHRvT2JqZWN0ICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBmYWlscyAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXHJcbiAgLCAkc29ydCAgICAgPSBbXS5zb3J0XHJcbiAgLCB0ZXN0ICAgICAgPSBbMSwgMiwgM107XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbigpe1xyXG4gIC8vIElFOC1cclxuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcclxufSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgLy8gVjggYnVnXHJcbiAgdGVzdC5zb3J0KG51bGwpO1xyXG4gIC8vIE9sZCBXZWJLaXRcclxufSkgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkc29ydCkpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcclxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbil7XHJcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcclxuICAgICAgPyAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxyXG4gICAgICA6ICRzb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzXG4gKiogbW9kdWxlIGlkID0gMTY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZm9yRWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKVxyXG4gICwgU1RSSUNUICAgPSByZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZm9yRWFjaCwgdHJ1ZSk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFTVFJJQ1QsICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTAgLyAxNS40LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcclxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKXtcclxuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoLmpzXG4gKiogbW9kdWxlIGlkID0gMTcwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBhc2MgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRZUEUsICRjcmVhdGUpe1xuICB2YXIgSVNfTUFQICAgICAgICA9IFRZUEUgPT0gMVxuICAgICwgSVNfRklMVEVSICAgICA9IFRZUEUgPT0gMlxuICAgICwgSVNfU09NRSAgICAgICA9IFRZUEUgPT0gM1xuICAgICwgSVNfRVZFUlkgICAgICA9IFRZUEUgPT0gNFxuICAgICwgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNlxuICAgICwgTk9fSE9MRVMgICAgICA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYXG4gICAgLCBjcmVhdGUgICAgICAgID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCl7XG4gICAgdmFyIE8gICAgICA9IHRvT2JqZWN0KCR0aGlzKVxuICAgICAgLCBzZWxmICAgPSBJT2JqZWN0KE8pXG4gICAgICAsIGYgICAgICA9IGN0eChjYWxsYmFja2ZuLCB0aGF0LCAzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gMFxuICAgICAgLCByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkXG4gICAgICAsIHZhbCwgcmVzO1xuICAgIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZil7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZihUWVBFKXtcbiAgICAgICAgaWYoSVNfTUFQKXJlc3VsdFtpbmRleF0gPSByZXM7ICAgICAgICAgICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYocmVzKXN3aXRjaChUWVBFKXtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmKElTX0VWRVJZKXJldHVybiBmYWxzZTsgICAgICAgICAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaXNBcnJheSAgPSByZXF1aXJlKCcuL19pcy1hcnJheScpXG4gICwgU1BFQ0lFUyAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbCwgbGVuZ3RoKXtcbiAgdmFyIEM7XG4gIGlmKGlzQXJyYXkob3JpZ2luYWwpKXtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZih0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpQyA9IHVuZGVmaW5lZDtcbiAgICBpZihpc09iamVjdChDKSl7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmKEMgPT09IG51bGwpQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGgpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJG1hcCAgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgxKTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5tYXAsIHRydWUpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjE1IC8gMTUuNC40LjE5IEFycmF5LnByb3RvdHlwZS5tYXAoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcclxuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLyl7XHJcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm1hcC5qc1xuICoqIG1vZHVsZSBpZCA9IDE3M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmZpbHRlciwgdHJ1ZSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXHJcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pe1xyXG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHNvbWUgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgzKTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy4yMyAvIDE1LjQuNC4xNyBBcnJheS5wcm90b3R5cGUuc29tZShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxyXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pe1xyXG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE3NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZXZlcnkgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDQpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy41IC8gMTUuNC40LjE2IEFycmF5LnByb3RvdHlwZS5ldmVyeShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxyXG4gIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLyl7XHJcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZXZlcnkuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZSwgdHJ1ZSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTggLyAxNS40LjQuMjEgQXJyYXkucHJvdG90eXBlLnJlZHVjZShjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXHJcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLyl7XHJcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIGZhbHNlKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsIHRvT2JqZWN0ICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBJT2JqZWN0ICAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcclxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aGF0LCBjYWxsYmFja2ZuLCBhTGVuLCBtZW1vLCBpc1JpZ2h0KXtcclxuICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XHJcbiAgdmFyIE8gICAgICA9IHRvT2JqZWN0KHRoYXQpXHJcbiAgICAsIHNlbGYgICA9IElPYmplY3QoTylcclxuICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXHJcbiAgICAsIGluZGV4ICA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMFxyXG4gICAgLCBpICAgICAgPSBpc1JpZ2h0ID8gLTEgOiAxO1xyXG4gIGlmKGFMZW4gPCAyKWZvcig7Oyl7XHJcbiAgICBpZihpbmRleCBpbiBzZWxmKXtcclxuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xyXG4gICAgICBpbmRleCArPSBpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGluZGV4ICs9IGk7XHJcbiAgICBpZihpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KXtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZvcig7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSlpZihpbmRleCBpbiBzZWxmKXtcclxuICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIHNlbGZbaW5kZXhdLCBpbmRleCwgTyk7XHJcbiAgfVxyXG4gIHJldHVybiBtZW1vO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1yZWR1Y2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZVJpZ2h0LCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy4xOSAvIDE1LjQuNC4yMiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxyXG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKXtcclxuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgdHJ1ZSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzXG4gKiogbW9kdWxlIGlkID0gMTc5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRpbmRleE9mICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxyXG4gICwgJG5hdGl2ZSAgICAgICA9IFtdLmluZGV4T2ZcclxuICAsIE5FR0FUSVZFX1pFUk8gPSAhISRuYXRpdmUgJiYgMSAvIFsxXS5pbmRleE9mKDEsIC0wKSA8IDA7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChORUdBVElWRV9aRVJPIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJG5hdGl2ZSkpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjExIC8gMTUuNC40LjE0IEFycmF5LnByb3RvdHlwZS5pbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcclxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCA9IDAgKi8pe1xyXG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cclxuICAgICAgLy8gY29udmVydCAtMCB0byArMFxyXG4gICAgICA/ICRuYXRpdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwXHJcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZi5qc1xuICoqIG1vZHVsZSBpZCA9IDE4MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b0lPYmplY3QgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXHJcbiAgLCB0b0ludGVnZXIgICAgID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXHJcbiAgLCB0b0xlbmd0aCAgICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcclxuICAsICRuYXRpdmUgICAgICAgPSBbXS5sYXN0SW5kZXhPZlxyXG4gICwgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChORUdBVElWRV9aRVJPIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJG5hdGl2ZSkpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXHJcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCA9IEBbKi0xXSAqLyl7XHJcbiAgICAvLyBjb252ZXJ0IC0wIHRvICswXHJcbiAgICBpZihORUdBVElWRV9aRVJPKXJldHVybiAkbmF0aXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMDtcclxuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QodGhpcylcclxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcclxuICAgICAgLCBpbmRleCAgPSBsZW5ndGggLSAxO1xyXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA+IDEpaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xyXG4gICAgaWYoaW5kZXggPCAwKWluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XHJcbiAgICBmb3IoO2luZGV4ID49IDA7IGluZGV4LS0paWYoaW5kZXggaW4gTylpZihPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudClyZXR1cm4gaW5kZXggfHwgMDtcclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMTgxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7Y29weVdpdGhpbjogcmVxdWlyZSgnLi9fYXJyYXktY29weS13aXRoaW4nKX0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnY29weVdpdGhpbicpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qc1xuICoqIG1vZHVsZSBpZCA9IDE4MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjIuMS4zLjMgQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIHRvSW5kZXggID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gW10uY29weVdpdGhpbiB8fCBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldC8qPSAwKi8sIHN0YXJ0Lyo9IDAsIGVuZCA9IEBsZW5ndGgqLyl7XG4gIHZhciBPICAgICA9IHRvT2JqZWN0KHRoaXMpXG4gICAgLCBsZW4gICA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICwgdG8gICAgPSB0b0luZGV4KHRhcmdldCwgbGVuKVxuICAgICwgZnJvbSAgPSB0b0luZGV4KHN0YXJ0LCBsZW4pXG4gICAgLCBlbmQgICA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkXG4gICAgLCBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvSW5kZXgoZW5kLCBsZW4pKSAtIGZyb20sIGxlbiAtIHRvKVxuICAgICwgaW5jICAgPSAxO1xuICBpZihmcm9tIDwgdG8gJiYgdG8gPCBmcm9tICsgY291bnQpe1xuICAgIGluYyAgPSAtMTtcbiAgICBmcm9tICs9IGNvdW50IC0gMTtcbiAgICB0byAgICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZShjb3VudC0tID4gMCl7XG4gICAgaWYoZnJvbSBpbiBPKU9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byAgICs9IGluYztcbiAgICBmcm9tICs9IGluYztcbiAgfSByZXR1cm4gTztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWNvcHktd2l0aGluLmpzXG4gKiogbW9kdWxlIGlkID0gMTgzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKVxuICAsIEFycmF5UHJvdG8gID0gQXJyYXkucHJvdG90eXBlO1xuaWYoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKXJlcXVpcmUoJy4vX2hpZGUnKShBcnJheVByb3RvLCBVTlNDT1BBQkxFUywge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDE4NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge2ZpbGw6IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKX0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmlsbCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMTg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgdG9JbmRleCAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKXtcbiAgdmFyIE8gICAgICA9IHRvT2JqZWN0KHRoaXMpXG4gICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAsIGFMZW4gICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGluZGV4ICA9IHRvSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aClcbiAgICAsIGVuZCAgICA9IGFMZW4gPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkXG4gICAgLCBlbmRQb3MgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW5kZXgoZW5kLCBsZW5ndGgpO1xuICB3aGlsZShlbmRQb3MgPiBpbmRleClPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktZmlsbC5qc1xuICoqIG1vZHVsZSBpZCA9IDE4NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjggQXJyYXkucHJvdG90eXBlLmZpbmQocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRmaW5kICAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNSlcbiAgLCBLRVkgICAgID0gJ2ZpbmQnXG4gICwgZm9yY2VkICA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYoS0VZIGluIFtdKUFycmF5KDEpW0tFWV0oZnVuY3Rpb24oKXsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuLyosIHRoYXQgPSB1bmRlZmluZWQgKi8pe1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qc1xuICoqIG1vZHVsZSBpZCA9IDE4N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjkgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGZpbmQgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg2KVxuICAsIEtFWSAgICAgPSAnZmluZEluZGV4J1xuICAsIGZvcmNlZCAgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmKEtFWSBpbiBbXSlBcnJheSgxKVtLRVldKGZ1bmN0aW9uKCl7IGZvcmNlZCA9IGZhbHNlOyB9KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZm9yY2VkLCAnQXJyYXknLCB7XG4gIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KGNhbGxiYWNrZm4vKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMTg4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdBcnJheScpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzXG4gKiogbW9kdWxlIGlkID0gMTg5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBTUEVDSUVTICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSlkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzXG4gKiogbW9kdWxlIGlkID0gMTkwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDE5MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG4gIHJldHVybiB7dmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmV9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzXG4gKiogbW9kdWxlIGlkID0gMTkyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZ2xvYmFsICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpXG4gICwgZFAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgZ09QTiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmZcbiAgLCBpc1JlZ0V4cCAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpXG4gICwgJGZsYWdzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mbGFncycpXG4gICwgJFJlZ0V4cCAgICAgICAgICAgPSBnbG9iYWwuUmVnRXhwXG4gICwgQmFzZSAgICAgICAgICAgICAgPSAkUmVnRXhwXG4gICwgcHJvdG8gICAgICAgICAgICAgPSAkUmVnRXhwLnByb3RvdHlwZVxuICAsIHJlMSAgICAgICAgICAgICAgID0gL2EvZ1xuICAsIHJlMiAgICAgICAgICAgICAgID0gL2EvZ1xuICAvLyBcIm5ld1wiIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Z2d5IGhlcmVcbiAgLCBDT1JSRUNUX05FVyAgICAgICA9IG5ldyAkUmVnRXhwKHJlMSkgIT09IHJlMTtcblxuaWYocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAoIUNPUlJFQ1RfTkVXIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmUyW3JlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpXSA9IGZhbHNlO1xuICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICByZXR1cm4gJFJlZ0V4cChyZTEpICE9IHJlMSB8fCAkUmVnRXhwKHJlMikgPT0gcmUyIHx8ICRSZWdFeHAocmUxLCAnaScpICE9ICcvYS9pJztcbn0pKSl7XG4gICRSZWdFeHAgPSBmdW5jdGlvbiBSZWdFeHAocCwgZil7XG4gICAgdmFyIHRpUkUgPSB0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cFxuICAgICAgLCBwaVJFID0gaXNSZWdFeHAocClcbiAgICAgICwgZmlVICA9IGYgPT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gIXRpUkUgJiYgcGlSRSAmJiBwLmNvbnN0cnVjdG9yID09PSAkUmVnRXhwICYmIGZpVSA/IHBcbiAgICAgIDogaW5oZXJpdElmUmVxdWlyZWQoQ09SUkVDVF9ORVdcbiAgICAgICAgPyBuZXcgQmFzZShwaVJFICYmICFmaVUgPyBwLnNvdXJjZSA6IHAsIGYpXG4gICAgICAgIDogQmFzZSgocGlSRSA9IHAgaW5zdGFuY2VvZiAkUmVnRXhwKSA/IHAuc291cmNlIDogcCwgcGlSRSAmJiBmaVUgPyAkZmxhZ3MuY2FsbChwKSA6IGYpXG4gICAgICAsIHRpUkUgPyB0aGlzIDogcHJvdG8sICRSZWdFeHApO1xuICB9O1xuICB2YXIgcHJveHkgPSBmdW5jdGlvbihrZXkpe1xuICAgIGtleSBpbiAkUmVnRXhwIHx8IGRQKCRSZWdFeHAsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gQmFzZVtrZXldOyB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihpdCl7IEJhc2Vba2V5XSA9IGl0OyB9XG4gICAgfSk7XG4gIH07XG4gIGZvcih2YXIga2V5cyA9IGdPUE4oQmFzZSksIGkgPSAwOyBrZXlzLmxlbmd0aCA+IGk7IClwcm94eShrZXlzW2krK10pO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICRSZWdFeHA7XG4gICRSZWdFeHAucHJvdG90eXBlID0gcHJvdG87XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCAnUmVnRXhwJywgJFJlZ0V4cCk7XG59XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ1JlZ0V4cCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIHRoYXQgICA9IGFuT2JqZWN0KHRoaXMpXG4gICAgLCByZXN1bHQgPSAnJztcbiAgaWYodGhhdC5nbG9iYWwpICAgICByZXN1bHQgKz0gJ2cnO1xuICBpZih0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmKHRoYXQubXVsdGlsaW5lKSAgcmVzdWx0ICs9ICdtJztcbiAgaWYodGhhdC51bmljb2RlKSAgICByZXN1bHQgKz0gJ3UnO1xuICBpZih0aGF0LnN0aWNreSkgICAgIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mbGFncy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG5yZXF1aXJlKCcuL2VzNi5yZWdleHAuZmxhZ3MnKTtcclxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcclxuICAsICRmbGFncyAgICAgID0gcmVxdWlyZSgnLi9fZmxhZ3MnKVxyXG4gICwgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXHJcbiAgLCBUT19TVFJJTkcgICA9ICd0b1N0cmluZydcclxuICAsICR0b1N0cmluZyAgID0gLy4vW1RPX1NUUklOR107XHJcblxyXG52YXIgZGVmaW5lID0gZnVuY3Rpb24oZm4pe1xyXG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmbiwgdHJ1ZSk7XHJcbn07XHJcblxyXG4vLyAyMS4yLjUuMTQgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZygpXHJcbmlmKHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXsgcmV0dXJuICR0b1N0cmluZy5jYWxsKHtzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJ30pICE9ICcvYS9iJzsgfSkpe1xyXG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpe1xyXG4gICAgdmFyIFIgPSBhbk9iamVjdCh0aGlzKTtcclxuICAgIHJldHVybiAnLycuY29uY2F0KFIuc291cmNlLCAnLycsXHJcbiAgICAgICdmbGFncycgaW4gUiA/IFIuZmxhZ3MgOiAhREVTQ1JJUFRPUlMgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCA/ICRmbGFncy5jYWxsKFIpIDogdW5kZWZpbmVkKTtcclxuICB9KTtcclxuLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWVcclxufSBlbHNlIGlmKCR0b1N0cmluZy5uYW1lICE9IFRPX1NUUklORyl7XHJcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCl7XHJcbiAgICByZXR1cm4gJHRvU3RyaW5nLmNhbGwodGhpcyk7XHJcbiAgfSk7XHJcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAvLi9nLmZsYWdzICE9ICdnJylyZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IHJlcXVpcmUoJy4vX2ZsYWdzJylcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIEBAbWF0Y2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnbWF0Y2gnLCAxLCBmdW5jdGlvbihkZWZpbmVkLCBNQVRDSCwgJG1hdGNoKXtcbiAgLy8gMjEuMS4zLjExIFN0cmluZy5wcm90b3R5cGUubWF0Y2gocmVnZXhwKVxuICByZXR1cm4gW2Z1bmN0aW9uIG1hdGNoKHJlZ2V4cCl7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPICA9IGRlZmluZWQodGhpcylcbiAgICAgICwgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgfSwgJG1hdGNoXTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2guanNcbiAqKiBtb2R1bGUgaWQgPSAxOTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBoaWRlICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGZhaWxzICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIGRlZmluZWQgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgd2tzICAgICAgPSByZXF1aXJlKCcuL193a3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGxlbmd0aCwgZXhlYyl7XG4gIHZhciBTWU1CT0wgICA9IHdrcyhLRVkpXG4gICAgLCBmbnMgICAgICA9IGV4ZWMoZGVmaW5lZCwgU1lNQk9MLCAnJ1tLRVldKVxuICAgICwgc3RyZm4gICAgPSBmbnNbMF1cbiAgICAsIHJ4Zm4gICAgID0gZm5zWzFdO1xuICBpZihmYWlscyhmdW5jdGlvbigpe1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSkpe1xuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyZm4pO1xuICAgIGhpZGUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24oc3RyaW5nLCBhcmcpeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uKHN0cmluZyl7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzKTsgfVxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanNcbiAqKiBtb2R1bGUgaWQgPSAxOThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24oZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2Upe1xuICAvLyAyMS4xLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpXG4gIHJldHVybiBbZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICB9LCAkcmVwbGFjZV07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIEBAc2VhcmNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NlYXJjaCcsIDEsIGZ1bmN0aW9uKGRlZmluZWQsIFNFQVJDSCwgJHNlYXJjaCl7XG4gIC8vIDIxLjEuMy4xNSBTdHJpbmcucHJvdG90eXBlLnNlYXJjaChyZWdleHApXG4gIHJldHVybiBbZnVuY3Rpb24gc2VhcmNoKHJlZ2V4cCl7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPICA9IGRlZmluZWQodGhpcylcbiAgICAgICwgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbU0VBUkNIXShTdHJpbmcoTykpO1xuICB9LCAkc2VhcmNoXTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoLmpzXG4gKiogbW9kdWxlIGlkID0gMjAwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24oZGVmaW5lZCwgU1BMSVQsICRzcGxpdCl7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGlzUmVnRXhwICAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKVxuICAgICwgX3NwbGl0ICAgICA9ICRzcGxpdFxuICAgICwgJHB1c2ggICAgICA9IFtdLnB1c2hcbiAgICAsICRTUExJVCAgICAgPSAnc3BsaXQnXG4gICAgLCBMRU5HVEggICAgID0gJ2xlbmd0aCdcbiAgICAsIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcbiAgaWYoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICl7XG4gICAgdmFyIE5QQ0cgPSAvKCk/Py8uZXhlYygnJylbMV0gPT09IHVuZGVmaW5lZDsgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICAkc3BsaXQgPSBmdW5jdGlvbihzZXBhcmF0b3IsIGxpbWl0KXtcbiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZihzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMClyZXR1cm4gW107XG4gICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgaWYoIWlzUmVnRXhwKHNlcGFyYXRvcikpcmV0dXJuIF9zcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gNDI5NDk2NzI5NSA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aCwgaTtcbiAgICAgIC8vIERvZXNuJ3QgbmVlZCBmbGFncyBneSwgYnV0IHRoZXkgZG9uJ3QgaHVydFxuICAgICAgaWYoIU5QQ0cpc2VwYXJhdG9yMiA9IG5ldyBSZWdFeHAoJ14nICsgc2VwYXJhdG9yQ29weS5zb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICAgIHdoaWxlKG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZykpe1xuICAgICAgICAvLyBgc2VwYXJhdG9yQ29weS5sYXN0SW5kZXhgIGlzIG5vdCByZWxpYWJsZSBjcm9zcy1icm93c2VyXG4gICAgICAgIGxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgaWYobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCl7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yIE5QQ0dcbiAgICAgICAgICBpZighTlBDRyAmJiBtYXRjaFtMRU5HVEhdID4gMSltYXRjaFswXS5yZXBsYWNlKHNlcGFyYXRvcjIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCBhcmd1bWVudHNbTEVOR1RIXSAtIDI7IGkrKylpZihhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCltYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZihtYXRjaFtMRU5HVEhdID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZ1tMRU5HVEhdKSRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYob3V0cHV0W0xFTkdUSF0gPj0gc3BsaXRMaW1pdClicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZihzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleClzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdKys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmKGxhc3RMYXN0SW5kZXggPT09IHN0cmluZ1tMRU5HVEhdKXtcbiAgICAgICAgaWYobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSlvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXRbTEVOR1RIXSA+IHNwbGl0TGltaXQgPyBvdXRwdXQuc2xpY2UoMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKXtcbiAgICAkc3BsaXQgPSBmdW5jdGlvbihzZXBhcmF0b3IsIGxpbWl0KXtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogX3NwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfVxuICAvLyAyMS4xLjMuMTcgU3RyaW5nLnByb3RvdHlwZS5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KVxuICByZXR1cm4gW2Z1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpe1xuICAgIHZhciBPICA9IGRlZmluZWQodGhpcylcbiAgICAgICwgZm4gPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdCkgOiAkc3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICB9LCAkc3BsaXRdO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qc1xuICoqIG1vZHVsZSBpZCA9IDIwMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjbGFzc29mICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYW5PYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gICAgICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBhbkluc3RhbmNlICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgZm9yT2YgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBzZXRQcm90byAgICAgICAgICAgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXRcbiAgLCBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgLCB0YXNrICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgbWljcm90YXNrICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJylcbiAgLCBQUk9NSVNFICAgICAgICAgICAgPSAnUHJvbWlzZSdcbiAgLCBUeXBlRXJyb3IgICAgICAgICAgPSBnbG9iYWwuVHlwZUVycm9yXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCAkUHJvbWlzZSAgICAgICAgICAgPSBnbG9iYWxbUFJPTUlTRV1cbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIGlzTm9kZSAgICAgICAgICAgICA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgZW1wdHkgICAgICAgICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIEludGVybmFsLCBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbigpe1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlICAgICA9ICRQcm9taXNlLnJlc29sdmUoMSlcbiAgICAgICwgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uKGV4ZWMpeyBleGVjKGVtcHR5LCBlbXB0eSk7IH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBzYW1lQ29uc3RydWN0b3IgPSBmdW5jdGlvbihhLCBiKXtcbiAgLy8gd2l0aCBsaWJyYXJ5IHdyYXBwZXIgc3BlY2lhbCBjYXNlXG4gIHJldHVybiBhID09PSBiIHx8IGEgPT09ICRQcm9taXNlICYmIGIgPT09IFdyYXBwZXI7XG59O1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgPyBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICA6IG5ldyBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oQyl7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uKCQkcmVzb2x2ZSwgJCRyZWplY3Qpe1xuICAgIGlmKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ICA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcbnZhciBwZXJmb3JtID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB7ZXJyb3I6IGV9O1xuICB9XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uKHByb21pc2UsIGlzUmVqZWN0KXtcbiAgaWYocHJvbWlzZS5fbilyZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIG9rICAgID0gcHJvbWlzZS5fcyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIGRvbWFpbiAgPSByZWFjdGlvbi5kb21haW5cbiAgICAgICAgLCByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZihoYW5kbGVyKXtcbiAgICAgICAgICBpZighb2spe1xuICAgICAgICAgICAgaWYocHJvbWlzZS5faCA9PSAyKW9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGhhbmRsZXIgPT09IHRydWUpcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2Upe1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSl7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSlydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdCAmJiAhcHJvbWlzZS5faClvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBhYnJ1cHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYoaXNVbmhhbmRsZWQocHJvbWlzZSkpe1xuICAgICAgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgICBpZihpc05vZGUpe1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbil7XG4gICAgICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmKGFicnVwdCl0aHJvdyBhYnJ1cHQuZXJyb3I7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICBpZihwcm9taXNlLl9oID09IDEpcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2NcbiAgICAsIGkgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpe1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZihyZWFjdGlvbi5mYWlsIHx8ICFpc1VuaGFuZGxlZChyZWFjdGlvbi5wcm9taXNlKSlyZXR1cm4gZmFsc2U7XG4gIH0gcmV0dXJuIHRydWU7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYoaXNOb2RlKXtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCl7XG4gICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3Z9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmKCFwcm9taXNlLl9hKXByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZihwcm9taXNlID09PSB2YWx1ZSl0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZih0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpe1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge193OiBwcm9taXNlLCBfZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2goZSl7XG4gICAgJHJlamVjdC5jYWxsKHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmKCFVU0VfTkFUSVZFKXtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaChlcnIpe1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCl7XG4gICAgICB2YXIgcmVhY3Rpb24gICAgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rICAgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCAgID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fYSl0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYodGhpcy5fcylub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpe1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcHJvbWlzZSAgPSBuZXcgSW50ZXJuYWw7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ICA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6ICRQcm9taXNlfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpe1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZWplY3QgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiAkUHJvbWlzZSAmJiBzYW1lQ29uc3RydWN0b3IoeC5jb25zdHJ1Y3RvciwgdGhpcykpcmV0dXJuIHg7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdmFsdWVzICAgID0gW11cbiAgICAgICAgLCBpbmRleCAgICAgPSAwXG4gICAgICAgICwgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIHZhciAkaW5kZXggICAgICAgID0gaW5kZXgrK1xuICAgICAgICAgICwgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanNcbiAqKiBtb2R1bGUgaWQgPSAyMDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1Ipe1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbigpeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3I7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMjAzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIEQpe1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yLCBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMjA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2h0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanNcbiAqKiBtb2R1bGUgaWQgPSAyMDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbnZhciBmbHVzaCA9IGZ1bmN0aW9uKCl7XG4gIHZhciBwYXJlbnQsIGZuO1xuICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSlwYXJlbnQuZXhpdCgpO1xuICB3aGlsZShoZWFkKXtcbiAgICBmbiA9IGhlYWQuZm47XG4gICAgZm4oKTsgLy8gPC0gY3VycmVudGx5IHdlIHVzZSBpdCBvbmx5IGZvciBQcm9taXNlIC0gdHJ5IC8gY2F0Y2ggbm90IHJlcXVpcmVkXG4gICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG59O1xuXG4vLyBOb2RlLmpzXG5pZihpc05vZGUpe1xuICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICB9O1xuLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG59IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICB9O1xuLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2Vcbn0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaCk7XG4gIH07XG4vLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuLy8gLSBzZXRJbW1lZGlhdGVcbi8vIC0gTWVzc2FnZUNoYW5uZWxcbi8vIC0gd2luZG93LnBvc3RNZXNzYWdcbi8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4vLyAtIHNldFRpbWVvdXRcbn0gZWxzZSB7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuKXtcbiAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gIGlmKCFoZWFkKXtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qc1xuICoqIG1vZHVsZSBpZCA9IDIwNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qc1xuICoqIG1vZHVsZSBpZCA9IDIwN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKCdNYXAnLCBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSl7XG4gICAgdmFyIGVudHJ5ID0gc3Ryb25nLmdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnY7XG4gIH0sXG4gIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpe1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzXG4gKiogbW9kdWxlIGlkID0gMjA4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgY3JlYXRlICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBoaWRlICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJylcbiAgLCBjdHggICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgYW5JbnN0YW5jZSAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgZGVmaW5lZCAgICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJylcbiAgLCBmb3JPZiAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpXG4gICwgc3RlcCAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKVxuICAsIHNldFNwZWNpZXMgID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIGZhc3RLZXkgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLmZhc3RLZXlcbiAgLCBTSVpFICAgICAgICA9IERFU0NSSVBUT1JTID8gJ19zJyA6ICdzaXplJztcblxudmFyIGdldEVudHJ5ID0gZnVuY3Rpb24odGhhdCwga2V5KXtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KSwgZW50cnk7XG4gIGlmKGluZGV4ICE9PSAnRicpcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yKGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubil7XG4gICAgaWYoZW50cnkuayA9PSBrZXkpcmV0dXJuIGVudHJ5O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpe1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBpdGVyYWJsZSl7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5faSA9IGNyZWF0ZShudWxsKTsgLy8gaW5kZXhcbiAgICAgIHRoYXQuX2YgPSB1bmRlZmluZWQ7ICAgIC8vIGZpcnN0IGVudHJ5XG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAgICAvLyBsYXN0IGVudHJ5XG4gICAgICB0aGF0W1NJWkVdID0gMDsgICAgICAgICAvLyBzaXplXG4gICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCl7XG4gICAgICAgIGZvcih2YXIgdGhhdCA9IHRoaXMsIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pe1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmKGVudHJ5LnApZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAgICwgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZihlbnRyeSl7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uXG4gICAgICAgICAgICAsIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmKHByZXYpcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZihuZXh0KW5leHQucCA9IHByZXY7XG4gICAgICAgICAgaWYodGhhdC5fZiA9PSBlbnRyeSl0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZih0aGF0Ll9sID09IGVudHJ5KXRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGlzLCBDLCAnZm9yRWFjaCcpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMylcbiAgICAgICAgICAsIGVudHJ5O1xuICAgICAgICB3aGlsZShlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2Ype1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUoZW50cnkgJiYgZW50cnkucillbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSl7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYoREVTQ1JJUFRPUlMpZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gZGVmaW5lZCh0aGlzW1NJWkVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbih0aGF0LCBrZXksIHZhbHVlKXtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpXG4gICAgICAsIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmKGVudHJ5KXtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmKCF0aGF0Ll9mKXRoYXQuX2YgPSBlbnRyeTtcbiAgICAgIGlmKHByZXYpcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmKGluZGV4ICE9PSAnRicpdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24oQywgTkFNRSwgSVNfTUFQKXtcbiAgICAvLyBhZGQgLmtleXMsIC52YWx1ZXMsIC5lbnRyaWVzLCBbQEBpdGVyYXRvcl1cbiAgICAvLyAyMy4xLjMuNCwgMjMuMS4zLjgsIDIzLjEuMy4xMSwgMjMuMS4zLjEyLCAyMy4yLjMuNSwgMjMuMi4zLjgsIDIzLjIuMy4xMCwgMjMuMi4zLjExXG4gICAgJGl0ZXJEZWZpbmUoQywgTkFNRSwgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICAgICAgdGhpcy5fdCA9IGl0ZXJhdGVkOyAgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdGhhdCAgPSB0aGlzXG4gICAgICAgICwga2luZCAgPSB0aGF0Ll9rXG4gICAgICAgICwgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZShlbnRyeSAmJiBlbnRyeS5yKWVudHJ5ID0gZW50cnkucDtcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZighdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKXtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycgLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGFkZCBbQEBzcGVjaWVzXSwgMjMuMS4yLjIsIDIzLjIuMi4yXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanNcbiAqKiBtb2R1bGUgaWQgPSAyMDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgJGV4cG9ydCAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIHJlZGVmaW5lQWxsICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJylcbiAgLCBtZXRhICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKVxuICAsIGZvck9mICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBhbkluc3RhbmNlICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBpc09iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZmFpbHMgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgJGl0ZXJEZXRlY3QgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgICAgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspe1xuICB2YXIgQmFzZSAgPSBnbG9iYWxbTkFNRV1cbiAgICAsIEMgICAgID0gQmFzZVxuICAgICwgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnXG4gICAgLCBwcm90byA9IEMgJiYgQy5wcm90b3R5cGVcbiAgICAsIE8gICAgID0ge307XG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbihLRVkpe1xuICAgIHZhciBmbiA9IHByb3RvW0tFWV07XG4gICAgcmVkZWZpbmUocHJvdG8sIEtFWSxcbiAgICAgIEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uKGEpe1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSl7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChhKXtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gdW5kZWZpbmVkIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnYWRkJyA/IGZ1bmN0aW9uIGFkZChhKXsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKXsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEsIGIpOyByZXR1cm4gdGhpczsgfVxuICAgICk7XG4gIH07XG4gIGlmKHR5cGVvZiBDICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IHByb3RvLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpe1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQyA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgbWV0aG9kcyk7XG4gICAgbWV0YS5ORUVEID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaW5zdGFuY2UgICAgICAgICAgICAgPSBuZXcgQ1xuICAgICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgICAgLCBIQVNOVF9DSEFJTklORyAgICAgICA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2VcbiAgICAgIC8vIFY4IH4gIENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgICAgLCBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uKCl7IGluc3RhbmNlLmhhcygxKTsgfSlcbiAgICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICAgICwgQUNDRVBUX0lURVJBQkxFUyAgICAgPSAkaXRlckRldGVjdChmdW5jdGlvbihpdGVyKXsgbmV3IEMoaXRlcik7IH0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICAgICwgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgICB2YXIgJGluc3RhbmNlID0gbmV3IEMoKVxuICAgICAgICAgICwgaW5kZXggICAgID0gNTtcbiAgICAgICAgd2hpbGUoaW5kZXgtLSkkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgICB9KTtcbiAgICBpZighQUNDRVBUX0lURVJBQkxFUyl7IFxuICAgICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGFyZ2V0LCBpdGVyYWJsZSl7XG4gICAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgICB9KTtcbiAgICAgIEMucHJvdG90eXBlID0gcHJvdG87XG4gICAgICBwcm90by5jb25zdHJ1Y3RvciA9IEM7XG4gICAgfVxuICAgIGlmKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pe1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG4gICAgaWYoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORylmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYoSVNfV0VBSyAmJiBwcm90by5jbGVhcilkZWxldGUgcHJvdG8uY2xlYXI7XG4gIH1cblxuICBzZXRUb1N0cmluZ1RhZyhDLCBOQU1FKTtcblxuICBPW05BTUVdID0gQztcbiAgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQyAhPSBCYXNlKSwgTyk7XG5cbiAgaWYoIUlTX1dFQUspY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDIxMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKCdTZXQnLCBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpe1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzXG4gKiogbW9kdWxlIGlkID0gMjExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgZWFjaCAgICAgICAgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApXG4gICwgcmVkZWZpbmUgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIG1ldGEgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKVxuICAsIGFzc2lnbiAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKVxuICAsIHdlYWsgICAgICAgICA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIGdldFdlYWsgICAgICA9IG1ldGEuZ2V0V2Vha1xuICAsIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGVcbiAgLCB1bmNhdWdodEZyb3plblN0b3JlID0gd2Vhay51ZnN0b3JlXG4gICwgdG1wICAgICAgICAgID0ge31cbiAgLCBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpe1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSl7XG4gICAgaWYoaXNPYmplY3Qoa2V5KSl7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmKGRhdGEgPT09IHRydWUpcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhpcykuZ2V0KGtleSk7XG4gICAgICByZXR1cm4gZGF0YSA/IGRhdGFbdGhpcy5faV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LFxuICAvLyAyMy4zLjMuNSBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSl7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHRoaXMsIGtleSwgdmFsdWUpO1xuICB9XG59O1xuXG4vLyAyMy4zIFdlYWtNYXAgT2JqZWN0c1xudmFyICRXZWFrTWFwID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoJ1dlYWtNYXAnLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYobmV3ICRXZWFrTWFwKCkuc2V0KChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkodG1wKSwgNykuZ2V0KHRtcCkgIT0gNyl7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyKTtcbiAgYXNzaWduKEludGVybmFsTWFwLnByb3RvdHlwZSwgbWV0aG9kcyk7XG4gIG1ldGEuTkVFRCA9IHRydWU7XG4gIGVhY2goWydkZWxldGUnLCAnaGFzJywgJ2dldCcsICdzZXQnXSwgZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgcHJvdG8gID0gJFdlYWtNYXAucHJvdG90eXBlXG4gICAgICAsIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24oYSwgYil7XG4gICAgICAvLyBzdG9yZSBmcm96ZW4gb2JqZWN0cyBvbiBpbnRlcm5hbCB3ZWFrbWFwIHNoaW1cbiAgICAgIGlmKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpe1xuICAgICAgICBpZighdGhpcy5fZil0aGlzLl9mID0gbmV3IEludGVybmFsTWFwO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZltrZXldKGEsIGIpO1xuICAgICAgICByZXR1cm4ga2V5ID09ICdzZXQnID8gdGhpcyA6IHJlc3VsdDtcbiAgICAgIC8vIHN0b3JlIGFsbCB0aGUgcmVzdCBvbiBuYXRpdmUgd2Vha21hcFxuICAgICAgfSByZXR1cm4gbWV0aG9kLmNhbGwodGhpcywgYSwgYik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qc1xuICoqIG1vZHVsZSBpZCA9IDIxMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJylcbiAgLCBnZXRXZWFrICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5nZXRXZWFrXG4gICwgYW5PYmplY3QgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbkluc3RhbmNlICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgY3JlYXRlQXJyYXlNZXRob2QgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJylcbiAgLCAkaGFzICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgYXJyYXlGaW5kICAgICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCg1KVxuICAsIGFycmF5RmluZEluZGV4ICAgID0gY3JlYXRlQXJyYXlNZXRob2QoNilcbiAgLCBpZCAgICAgICAgICAgICAgICA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbih0aGF0KXtcbiAgcmV0dXJuIHRoYXQuX2wgfHwgKHRoYXQuX2wgPSBuZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSk7XG59O1xudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbigpe1xuICB0aGlzLmEgPSBbXTtcbn07XG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24oc3RvcmUsIGtleSl7XG4gIHJldHVybiBhcnJheUZpbmQoc3RvcmUuYSwgZnVuY3Rpb24oaXQpe1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbihrZXkpe1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmKGVudHJ5KXJldHVybiBlbnRyeVsxXTtcbiAgfSxcbiAgaGFzOiBmdW5jdGlvbihrZXkpe1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmKGVudHJ5KWVudHJ5WzFdID0gdmFsdWU7XG4gICAgZWxzZSB0aGlzLmEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LFxuICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmEsIGZ1bmN0aW9uKGl0KXtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmKH5pbmRleCl0aGlzLmEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gISF+aW5kZXg7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24od3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUil7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGl0ZXJhYmxlKXtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll9pID0gaWQrKzsgICAgICAvLyBjb2xsZWN0aW9uIGlkXG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAvLyBsZWFrIHN0b3JlIGZvciB1bmNhdWdodCBmcm96ZW4gb2JqZWN0c1xuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbihrZXkpe1xuICAgICAgICBpZighaXNPYmplY3Qoa2V5KSlyZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2VhayhrZXkpO1xuICAgICAgICBpZihkYXRhID09PSB0cnVlKXJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHRoaXMpWydkZWxldGUnXShrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHRoaXMuX2kpICYmIGRlbGV0ZSBkYXRhW3RoaXMuX2ldO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjMuMy40IFdlYWtNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy40LjMuNCBXZWFrU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICBpZighaXNPYmplY3Qoa2V5KSlyZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2VhayhrZXkpO1xuICAgICAgICBpZihkYXRhID09PSB0cnVlKXJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHRoaXMpLmhhcyhrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiAkaGFzKGRhdGEsIHRoaXMuX2kpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uKHRoYXQsIGtleSwgdmFsdWUpe1xuICAgIHZhciBkYXRhID0gZ2V0V2Vhayhhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICBpZihkYXRhID09PSB0cnVlKXVuY2F1Z2h0RnJvemVuU3RvcmUodGhhdCkuc2V0KGtleSwgdmFsdWUpO1xuICAgIGVsc2UgZGF0YVt0aGF0Ll9pXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGF0O1xuICB9LFxuICB1ZnN0b3JlOiB1bmNhdWdodEZyb3plblN0b3JlXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXdlYWsuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWFrID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi13ZWFrJyk7XG5cbi8vIDIzLjQgV2Vha1NldCBPYmplY3RzXG5yZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoJ1dlYWtTZXQnLCBmdW5jdGlvbihnZXQpe1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSl7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHRoaXMsIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLXNldC5qc1xuICoqIG1vZHVsZSBpZCA9IDIxNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHR5cGVkICAgICAgID0gcmVxdWlyZSgnLi9fdHlwZWQnKVxuICAsIGJ1ZmZlciAgICAgICA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpXG4gICwgYW5PYmplY3QgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0luZGV4ICAgICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICwgdG9MZW5ndGggICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBpc09iamVjdCAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIFRZUEVEX0FSUkFZICA9IHJlcXVpcmUoJy4vX3drcycpKCd0eXBlZF9hcnJheScpXG4gICwgQXJyYXlCdWZmZXIgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuQXJyYXlCdWZmZXJcbiAgLCBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgLCAkQXJyYXlCdWZmZXIgPSBidWZmZXIuQXJyYXlCdWZmZXJcbiAgLCAkRGF0YVZpZXcgICAgPSBidWZmZXIuRGF0YVZpZXdcbiAgLCAkaXNWaWV3ICAgICAgPSAkdHlwZWQuQUJWICYmIEFycmF5QnVmZmVyLmlzVmlld1xuICAsICRzbGljZSAgICAgICA9ICRBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2VcbiAgLCBWSUVXICAgICAgICAgPSAkdHlwZWQuVklFV1xuICAsIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKEFycmF5QnVmZmVyICE9PSAkQXJyYXlCdWZmZXIpLCB7QXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlcn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEkdHlwZWQuQ09OU1RSLCBBUlJBWV9CVUZGRVIsIHtcbiAgLy8gMjQuMS4zLjEgQXJyYXlCdWZmZXIuaXNWaWV3KGFyZylcbiAgaXNWaWV3OiBmdW5jdGlvbiBpc1ZpZXcoaXQpe1xuICAgIHJldHVybiAkaXNWaWV3ICYmICRpc1ZpZXcoaXQpIHx8IGlzT2JqZWN0KGl0KSAmJiBWSUVXIGluIGl0O1xuICB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlUgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiAhbmV3ICRBcnJheUJ1ZmZlcigyKS5zbGljZSgxLCB1bmRlZmluZWQpLmJ5dGVMZW5ndGg7XG59KSwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuNC4zIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZShzdGFydCwgZW5kKVxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCl7XG4gICAgaWYoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpcmV0dXJuICRzbGljZS5jYWxsKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIHZhciBsZW4gICAgPSBhbk9iamVjdCh0aGlzKS5ieXRlTGVuZ3RoXG4gICAgICAsIGZpcnN0ICA9IHRvSW5kZXgoc3RhcnQsIGxlbilcbiAgICAgICwgZmluYWwgID0gdG9JbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZCwgbGVuKVxuICAgICAgLCByZXN1bHQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW5hbCAtIGZpcnN0KSlcbiAgICAgICwgdmlld1MgID0gbmV3ICREYXRhVmlldyh0aGlzKVxuICAgICAgLCB2aWV3VCAgPSBuZXcgJERhdGFWaWV3KHJlc3VsdClcbiAgICAgICwgaW5kZXggID0gMDtcbiAgICB3aGlsZShmaXJzdCA8IGZpbmFsKXtcbiAgICAgIHZpZXdULnNldFVpbnQ4KGluZGV4KyssIHZpZXdTLmdldFVpbnQ4KGZpcnN0KyspKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKEFSUkFZX0JVRkZFUik7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qc1xuICoqIG1vZHVsZSBpZCA9IDIxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBUWVBFRCAgPSB1aWQoJ3R5cGVkX2FycmF5JylcbiAgLCBWSUVXICAgPSB1aWQoJ3ZpZXcnKVxuICAsIEFCViAgICA9ICEhKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBnbG9iYWwuRGF0YVZpZXcpXG4gICwgQ09OU1RSID0gQUJWXG4gICwgaSA9IDAsIGwgPSA5LCBUeXBlZDtcblxudmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMgPSAoXG4gICdJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheSdcbikuc3BsaXQoJywnKTtcblxud2hpbGUoaSA8IGwpe1xuICBpZihUeXBlZCA9IGdsb2JhbFtUeXBlZEFycmF5Q29uc3RydWN0b3JzW2krK11dKXtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVFlQRUQsIHRydWUpO1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBWSUVXLCB0cnVlKTtcbiAgfSBlbHNlIENPTlNUUiA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQUJWOiAgICBBQlYsXG4gIENPTlNUUjogQ09OU1RSLFxuICBUWVBFRDogIFRZUEVELFxuICBWSUVXOiAgIFZJRVdcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLmpzXG4gKiogbW9kdWxlIGlkID0gMjE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIERFU0NSSVBUT1JTICAgID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgJHR5cGVkICAgICAgICAgPSByZXF1aXJlKCcuL190eXBlZCcpXG4gICwgaGlkZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZUFsbCAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICwgZmFpbHMgICAgICAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgYW5JbnN0YW5jZSAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgdG9JbnRlZ2VyICAgICAgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCB0b0xlbmd0aCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ09QTiAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmZcbiAgLCBkUCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBhcnJheUZpbGwgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEFSUkFZX0JVRkZFUiAgID0gJ0FycmF5QnVmZmVyJ1xuICAsIERBVEFfVklFVyAgICAgID0gJ0RhdGFWaWV3J1xuICAsIFBST1RPVFlQRSAgICAgID0gJ3Byb3RvdHlwZSdcbiAgLCBXUk9OR19MRU5HVEggICA9ICdXcm9uZyBsZW5ndGghJ1xuICAsIFdST05HX0lOREVYICAgID0gJ1dyb25nIGluZGV4ISdcbiAgLCAkQXJyYXlCdWZmZXIgICA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdXG4gICwgJERhdGFWaWV3ICAgICAgPSBnbG9iYWxbREFUQV9WSUVXXVxuICAsIE1hdGggICAgICAgICAgID0gZ2xvYmFsLk1hdGhcbiAgLCBwYXJzZUludCAgICAgICA9IGdsb2JhbC5wYXJzZUludFxuICAsIFJhbmdlRXJyb3IgICAgID0gZ2xvYmFsLlJhbmdlRXJyb3JcbiAgLCBJbmZpbml0eSAgICAgICA9IGdsb2JhbC5JbmZpbml0eVxuICAsIEJhc2VCdWZmZXIgICAgID0gJEFycmF5QnVmZmVyXG4gICwgYWJzICAgICAgICAgICAgPSBNYXRoLmFic1xuICAsIHBvdyAgICAgICAgICAgID0gTWF0aC5wb3dcbiAgLCBtaW4gICAgICAgICAgICA9IE1hdGgubWluXG4gICwgZmxvb3IgICAgICAgICAgPSBNYXRoLmZsb29yXG4gICwgbG9nICAgICAgICAgICAgPSBNYXRoLmxvZ1xuICAsIExOMiAgICAgICAgICAgID0gTWF0aC5MTjJcbiAgLCBCVUZGRVIgICAgICAgICA9ICdidWZmZXInXG4gICwgQllURV9MRU5HVEggICAgPSAnYnl0ZUxlbmd0aCdcbiAgLCBCWVRFX09GRlNFVCAgICA9ICdieXRlT2Zmc2V0J1xuICAsICRCVUZGRVIgICAgICAgID0gREVTQ1JJUFRPUlMgPyAnX2InIDogQlVGRkVSXG4gICwgJExFTkdUSCAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfbCcgOiBCWVRFX0xFTkdUSFxuICAsICRPRkZTRVQgICAgICAgID0gREVTQ1JJUFRPUlMgPyAnX28nIDogQllURV9PRkZTRVQ7XG5cbi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0XG52YXIgcGFja0lFRUU3NTQgPSBmdW5jdGlvbih2YWx1ZSwgbUxlbiwgbkJ5dGVzKXtcbiAgdmFyIGJ1ZmZlciA9IEFycmF5KG5CeXRlcylcbiAgICAsIGVMZW4gICA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICAgICwgZU1heCAgID0gKDEgPDwgZUxlbikgLSAxXG4gICAgLCBlQmlhcyAgPSBlTWF4ID4+IDFcbiAgICAsIHJ0ICAgICA9IG1MZW4gPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDBcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIHMgICAgICA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDBcbiAgICAsIGUsIG0sIGM7XG4gIHZhbHVlID0gYWJzKHZhbHVlKVxuICBpZih2YWx1ZSAhPSB2YWx1ZSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpe1xuICAgIG0gPSB2YWx1ZSAhPSB2YWx1ZSA/IDEgOiAwO1xuICAgIGUgPSBlTWF4O1xuICB9IGVsc2Uge1xuICAgIGUgPSBmbG9vcihsb2codmFsdWUpIC8gTE4yKTtcbiAgICBpZih2YWx1ZSAqIChjID0gcG93KDIsIC1lKSkgPCAxKXtcbiAgICAgIGUtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYoZSArIGVCaWFzID49IDEpe1xuICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZih2YWx1ZSAqIGMgPj0gMil7XG4gICAgICBlKys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmKGUgKyBlQmlhcyA+PSBlTWF4KXtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmKGUgKyBlQmlhcyA+PSAxKXtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gZSArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuICBmb3IoOyBtTGVuID49IDg7IGJ1ZmZlcltpKytdID0gbSAmIDI1NSwgbSAvPSAyNTYsIG1MZW4gLT0gOCk7XG4gIGUgPSBlIDw8IG1MZW4gfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvcig7IGVMZW4gPiAwOyBidWZmZXJbaSsrXSA9IGUgJiAyNTUsIGUgLz0gMjU2LCBlTGVuIC09IDgpO1xuICBidWZmZXJbLS1pXSB8PSBzICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufTtcbnZhciB1bnBhY2tJRUVFNzU0ID0gZnVuY3Rpb24oYnVmZmVyLCBtTGVuLCBuQnl0ZXMpe1xuICB2YXIgZUxlbiAgPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgICAsIGVNYXggID0gKDEgPDwgZUxlbikgLSAxXG4gICAgLCBlQmlhcyA9IGVNYXggPj4gMVxuICAgICwgbkJpdHMgPSBlTGVuIC0gN1xuICAgICwgaSAgICAgPSBuQnl0ZXMgLSAxXG4gICAgLCBzICAgICA9IGJ1ZmZlcltpLS1dXG4gICAgLCBlICAgICA9IHMgJiAxMjdcbiAgICAsIG07XG4gIHMgPj49IDc7XG4gIGZvcig7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIGUgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbUxlbjtcbiAgZm9yKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgaWYoZSA9PT0gMCl7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmKGUgPT09IGVNYXgpe1xuICAgIHJldHVybiBtID8gTmFOIDogcyA/IC1JbmZpbml0eSA6IEluZmluaXR5O1xuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgcG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH0gcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBwb3coMiwgZSAtIG1MZW4pO1xufTtcblxudmFyIHVucGFja0kzMiA9IGZ1bmN0aW9uKGJ5dGVzKXtcbiAgcmV0dXJuIGJ5dGVzWzNdIDw8IDI0IHwgYnl0ZXNbMl0gPDwgMTYgfCBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG59O1xudmFyIHBhY2tJOCA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIFtpdCAmIDB4ZmZdO1xufTtcbnZhciBwYWNrSTE2ID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmZdO1xufTtcbnZhciBwYWNrSTMyID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmYsIGl0ID4+IDE2ICYgMHhmZiwgaXQgPj4gMjQgJiAweGZmXTtcbn07XG52YXIgcGFja0Y2NCA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCA1MiwgOCk7XG59O1xudmFyIHBhY2tGMzIgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgMjMsIDQpO1xufTtcblxudmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uKEMsIGtleSwgaW50ZXJuYWwpe1xuICBkUChDW1BST1RPVFlQRV0sIGtleSwge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXNbaW50ZXJuYWxdOyB9fSk7XG59O1xuXG52YXIgZ2V0ID0gZnVuY3Rpb24odmlldywgYnl0ZXMsIGluZGV4LCBpc0xpdHRsZUVuZGlhbil7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleFxuICAgICwgaW50SW5kZXggPSB0b0ludGVnZXIobnVtSW5kZXgpO1xuICBpZihudW1JbmRleCAhPSBpbnRJbmRleCB8fCBpbnRJbmRleCA8IDAgfHwgaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2JcbiAgICAsIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdXG4gICAgLCBwYWNrICA9IHN0b3JlLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJ5dGVzKTtcbiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpO1xufTtcbnZhciBzZXQgPSBmdW5jdGlvbih2aWV3LCBieXRlcywgaW5kZXgsIGNvbnZlcnNpb24sIHZhbHVlLCBpc0xpdHRsZUVuZGlhbil7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleFxuICAgICwgaW50SW5kZXggPSB0b0ludGVnZXIobnVtSW5kZXgpO1xuICBpZihudW1JbmRleCAhPSBpbnRJbmRleCB8fCBpbnRJbmRleCA8IDAgfHwgaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2JcbiAgICAsIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdXG4gICAgLCBwYWNrICA9IGNvbnZlcnNpb24oK3ZhbHVlKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspc3RvcmVbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogYnl0ZXMgLSBpIC0gMV07XG59O1xuXG52YXIgdmFsaWRhdGVBcnJheUJ1ZmZlckFyZ3VtZW50cyA9IGZ1bmN0aW9uKHRoYXQsIGxlbmd0aCl7XG4gIGFuSW5zdGFuY2UodGhhdCwgJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuICB2YXIgbnVtYmVyTGVuZ3RoID0gK2xlbmd0aFxuICAgICwgYnl0ZUxlbmd0aCAgID0gdG9MZW5ndGgobnVtYmVyTGVuZ3RoKTtcbiAgaWYobnVtYmVyTGVuZ3RoICE9IGJ5dGVMZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICByZXR1cm4gYnl0ZUxlbmd0aDtcbn07XG5cbmlmKCEkdHlwZWQuQUJWKXtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKXtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHZhbGlkYXRlQXJyYXlCdWZmZXJBcmd1bWVudHModGhpcywgbGVuZ3RoKTtcbiAgICB0aGlzLl9iICAgICAgID0gYXJyYXlGaWxsLmNhbGwoQXJyYXkoYnl0ZUxlbmd0aCksIDApO1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gICREYXRhVmlldyA9IGZ1bmN0aW9uIERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCl7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkRGF0YVZpZXcsIERBVEFfVklFVyk7XG4gICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYnVmZmVyWyRMRU5HVEhdXG4gICAgICAsIG9mZnNldCAgICAgICA9IHRvSW50ZWdlcihieXRlT2Zmc2V0KTtcbiAgICBpZihvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHRoaXNbJEJVRkZFUl0gPSBidWZmZXI7XG4gICAgdGhpc1skT0ZGU0VUXSA9IG9mZnNldDtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBpZihERVNDUklQVE9SUyl7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJVRkZFUiwgJ19iJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfT0ZGU0VULCAnX28nKTtcbiAgfVxuXG4gIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgZ2V0SW50ODogZnVuY3Rpb24gZ2V0SW50OChieXRlT2Zmc2V0KXtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF0gPDwgMjQgPj4gMjQ7XG4gICAgfSxcbiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCl7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpO1xuICAgIH0sXG4gICAgZ2V0VWludDMyOiBmdW5jdGlvbiBnZXRVaW50MzIoYnl0ZU9mZnNldCAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpID4+PiAwO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQzMjogZnVuY3Rpb24gZ2V0RmxvYXQzMihieXRlT2Zmc2V0IC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDIzLCA0KTtcbiAgICB9LFxuICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIGdldEZsb2F0NjQoYnl0ZU9mZnNldCAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCA1MiwgOCk7XG4gICAgfSxcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKXtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSl7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRJbnQxNjogZnVuY3Rpb24gc2V0SW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEludDMyOiBmdW5jdGlvbiBzZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQzMjogZnVuY3Rpb24gc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrRjMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0NjQ6IGZ1bmN0aW9uIHNldEZsb2F0NjQoYnl0ZU9mZnNldCwgdmFsdWUgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Y2NCwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIGlmKCFmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyAkQXJyYXlCdWZmZXI7ICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgICBuZXcgJEFycmF5QnVmZmVyKC41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgfSkpe1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCl7XG4gICAgICByZXR1cm4gbmV3IEJhc2VCdWZmZXIodmFsaWRhdGVBcnJheUJ1ZmZlckFyZ3VtZW50cyh0aGlzLCBsZW5ndGgpKTtcbiAgICB9O1xuICAgIHZhciBBcnJheUJ1ZmZlclByb3RvID0gJEFycmF5QnVmZmVyW1BST1RPVFlQRV0gPSBCYXNlQnVmZmVyW1BST1RPVFlQRV07XG4gICAgZm9yKHZhciBrZXlzID0gZ09QTihCYXNlQnVmZmVyKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOyApe1xuICAgICAgaWYoISgoa2V5ID0ga2V5c1tqKytdKSBpbiAkQXJyYXlCdWZmZXIpKWhpZGUoJEFycmF5QnVmZmVyLCBrZXksIEJhc2VCdWZmZXJba2V5XSk7XG4gICAgfTtcbiAgICBpZighTElCUkFSWSlBcnJheUJ1ZmZlclByb3RvLmNvbnN0cnVjdG9yID0gJEFycmF5QnVmZmVyO1xuICB9XG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdmlldyA9IG5ldyAkRGF0YVZpZXcobmV3ICRBcnJheUJ1ZmZlcigyKSlcbiAgICAsICRzZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODtcbiAgdmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpO1xuICB2aWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7XG4gIGlmKHZpZXcuZ2V0SW50OCgwKSB8fCAhdmlldy5nZXRJbnQ4KDEpKXJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSl7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSl7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9XG4gIH0sIHRydWUpO1xufVxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuaGlkZSgkRGF0YVZpZXdbUFJPVE9UWVBFXSwgJHR5cGVkLlZJRVcsIHRydWUpO1xuZXhwb3J0c1tBUlJBWV9CVUZGRVJdID0gJEFycmF5QnVmZmVyO1xuZXhwb3J0c1tEQVRBX1ZJRVddID0gJERhdGFWaWV3O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL190eXBlZCcpLkFCViwge1xuICBEYXRhVmlldzogcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJykuRGF0YVZpZXdcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5kYXRhLXZpZXcuanNcbiAqKiBtb2R1bGUgaWQgPSAyMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuaWYocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSl7XG4gIHZhciBMSUJSQVJZICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICAgLCBnbG9iYWwgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgICAsIGZhaWxzICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICAgLCAkZXhwb3J0ICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgICAsICR0eXBlZCAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190eXBlZCcpXG4gICAgLCAkYnVmZmVyICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJylcbiAgICAsIGN0eCAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAgICwgYW5JbnN0YW5jZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgICAsIHByb3BlcnR5RGVzYyAgICAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgICAsIGhpZGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgICAsIHJlZGVmaW5lQWxsICAgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAgICwgaXNJbnRlZ2VyICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKVxuICAgICwgdG9JbnRlZ2VyICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAgICwgdG9MZW5ndGggICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICAgLCB0b0luZGV4ICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKVxuICAgICwgdG9QcmltaXRpdmUgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICAgLCBoYXMgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgICAsIHNhbWUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19zYW1lLXZhbHVlJylcbiAgICAsIGNsYXNzb2YgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgICAsIGlzT2JqZWN0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAgICwgdG9PYmplY3QgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICAgLCBpc0FycmF5SXRlciAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICAgLCBjcmVhdGUgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICAgLCBnZXRQcm90b3R5cGVPZiAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICAgLCBnT1BOICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mXG4gICAgLCBpc0l0ZXJhYmxlICAgICAgICAgID0gcmVxdWlyZSgnLi9jb3JlLmlzLWl0ZXJhYmxlJylcbiAgICAsIGdldEl0ZXJGbiAgICAgICAgICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpXG4gICAgLCB1aWQgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgICAsIHdrcyAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAgICwgY3JlYXRlQXJyYXlNZXRob2QgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKVxuICAgICwgY3JlYXRlQXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJylcbiAgICAsIHNwZWNpZXNDb25zdHJ1Y3RvciAgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgICAsIEFycmF5SXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICAgLCBJdGVyYXRvcnMgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgICAsICRpdGVyRGV0ZWN0ICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpXG4gICAgLCBzZXRTcGVjaWVzICAgICAgICAgID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKVxuICAgICwgYXJyYXlGaWxsICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKVxuICAgICwgYXJyYXlDb3B5V2l0aGluICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJylcbiAgICAsICREUCAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAgICwgJEdPUEQgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJylcbiAgICAsIGRQICAgICAgICAgICAgICAgICAgPSAkRFAuZlxuICAgICwgZ09QRCAgICAgICAgICAgICAgICA9ICRHT1BELmZcbiAgICAsIFJhbmdlRXJyb3IgICAgICAgICAgPSBnbG9iYWwuUmFuZ2VFcnJvclxuICAgICwgVHlwZUVycm9yICAgICAgICAgICA9IGdsb2JhbC5UeXBlRXJyb3JcbiAgICAsIFVpbnQ4QXJyYXkgICAgICAgICAgPSBnbG9iYWwuVWludDhBcnJheVxuICAgICwgQVJSQVlfQlVGRkVSICAgICAgICA9ICdBcnJheUJ1ZmZlcidcbiAgICAsIFNIQVJFRF9CVUZGRVIgICAgICAgPSAnU2hhcmVkJyArIEFSUkFZX0JVRkZFUlxuICAgICwgQllURVNfUEVSX0VMRU1FTlQgICA9ICdCWVRFU19QRVJfRUxFTUVOVCdcbiAgICAsIFBST1RPVFlQRSAgICAgICAgICAgPSAncHJvdG90eXBlJ1xuICAgICwgQXJyYXlQcm90byAgICAgICAgICA9IEFycmF5W1BST1RPVFlQRV1cbiAgICAsICRBcnJheUJ1ZmZlciAgICAgICAgPSAkYnVmZmVyLkFycmF5QnVmZmVyXG4gICAgLCAkRGF0YVZpZXcgICAgICAgICAgID0gJGJ1ZmZlci5EYXRhVmlld1xuICAgICwgYXJyYXlGb3JFYWNoICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDApXG4gICAgLCBhcnJheUZpbHRlciAgICAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoMilcbiAgICAsIGFycmF5U29tZSAgICAgICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCgzKVxuICAgICwgYXJyYXlFdmVyeSAgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDQpXG4gICAgLCBhcnJheUZpbmQgICAgICAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoNSlcbiAgICAsIGFycmF5RmluZEluZGV4ICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCg2KVxuICAgICwgYXJyYXlJbmNsdWRlcyAgICAgICA9IGNyZWF0ZUFycmF5SW5jbHVkZXModHJ1ZSlcbiAgICAsIGFycmF5SW5kZXhPZiAgICAgICAgPSBjcmVhdGVBcnJheUluY2x1ZGVzKGZhbHNlKVxuICAgICwgYXJyYXlWYWx1ZXMgICAgICAgICA9IEFycmF5SXRlcmF0b3JzLnZhbHVlc1xuICAgICwgYXJyYXlLZXlzICAgICAgICAgICA9IEFycmF5SXRlcmF0b3JzLmtleXNcbiAgICAsIGFycmF5RW50cmllcyAgICAgICAgPSBBcnJheUl0ZXJhdG9ycy5lbnRyaWVzXG4gICAgLCBhcnJheUxhc3RJbmRleE9mICAgID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZlxuICAgICwgYXJyYXlSZWR1Y2UgICAgICAgICA9IEFycmF5UHJvdG8ucmVkdWNlXG4gICAgLCBhcnJheVJlZHVjZVJpZ2h0ICAgID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodFxuICAgICwgYXJyYXlKb2luICAgICAgICAgICA9IEFycmF5UHJvdG8uam9pblxuICAgICwgYXJyYXlTb3J0ICAgICAgICAgICA9IEFycmF5UHJvdG8uc29ydFxuICAgICwgYXJyYXlTbGljZSAgICAgICAgICA9IEFycmF5UHJvdG8uc2xpY2VcbiAgICAsIGFycmF5VG9TdHJpbmcgICAgICAgPSBBcnJheVByb3RvLnRvU3RyaW5nXG4gICAgLCBhcnJheVRvTG9jYWxlU3RyaW5nID0gQXJyYXlQcm90by50b0xvY2FsZVN0cmluZ1xuICAgICwgSVRFUkFUT1IgICAgICAgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAgICwgVEFHICAgICAgICAgICAgICAgICA9IHdrcygndG9TdHJpbmdUYWcnKVxuICAgICwgVFlQRURfQ09OU1RSVUNUT1IgICA9IHVpZCgndHlwZWRfY29uc3RydWN0b3InKVxuICAgICwgREVGX0NPTlNUUlVDVE9SICAgICA9IHVpZCgnZGVmX2NvbnN0cnVjdG9yJylcbiAgICAsIEFMTF9DT05TVFJVQ1RPUlMgICAgPSAkdHlwZWQuQ09OU1RSXG4gICAgLCBUWVBFRF9BUlJBWSAgICAgICAgID0gJHR5cGVkLlRZUEVEXG4gICAgLCBWSUVXICAgICAgICAgICAgICAgID0gJHR5cGVkLlZJRVdcbiAgICAsIFdST05HX0xFTkdUSCAgICAgICAgPSAnV3JvbmcgbGVuZ3RoISc7XG5cbiAgdmFyICRtYXAgPSBjcmVhdGVBcnJheU1ldGhvZCgxLCBmdW5jdGlvbihPLCBsZW5ndGgpe1xuICAgIHJldHVybiBhbGxvY2F0ZShzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGVuZ3RoKTtcbiAgfSk7XG5cbiAgdmFyIExJVFRMRV9FTkRJQU4gPSBmYWlscyhmdW5jdGlvbigpe1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdID09PSAxO1xuICB9KTtcblxuICB2YXIgRk9SQ0VEX1NFVCA9ICEhVWludDhBcnJheSAmJiAhIVVpbnQ4QXJyYXlbUFJPVE9UWVBFXS5zZXQgJiYgZmFpbHMoZnVuY3Rpb24oKXtcbiAgICBuZXcgVWludDhBcnJheSgxKS5zZXQoe30pO1xuICB9KTtcblxuICB2YXIgc3RyaWN0VG9MZW5ndGggPSBmdW5jdGlvbihpdCwgU0FNRSl7XG4gICAgaWYoaXQgPT09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB2YXIgbnVtYmVyID0gK2l0XG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0KTtcbiAgICBpZihTQU1FICYmICFzYW1lKG51bWJlciwgbGVuZ3RoKSl0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgcmV0dXJuIGxlbmd0aDtcbiAgfTtcblxuICB2YXIgdG9PZmZzZXQgPSBmdW5jdGlvbihpdCwgQllURVMpe1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoaXQpO1xuICAgIGlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICUgQllURVMpdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIHJldHVybiBvZmZzZXQ7XG4gIH07XG5cbiAgdmFyIHZhbGlkYXRlID0gZnVuY3Rpb24oaXQpe1xuICAgIGlmKGlzT2JqZWN0KGl0KSAmJiBUWVBFRF9BUlJBWSBpbiBpdClyZXR1cm4gaXQ7XG4gICAgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSB0eXBlZCBhcnJheSEnKTtcbiAgfTtcblxuICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbihDLCBsZW5ndGgpe1xuICAgIGlmKCEoaXNPYmplY3QoQykgJiYgVFlQRURfQ09OU1RSVUNUT1IgaW4gQykpe1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciEnKTtcbiAgICB9IHJldHVybiBuZXcgQyhsZW5ndGgpO1xuICB9O1xuXG4gIHZhciBzcGVjaWVzRnJvbUxpc3QgPSBmdW5jdGlvbihPLCBsaXN0KXtcbiAgICByZXR1cm4gZnJvbUxpc3Qoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxpc3QpO1xuICB9O1xuXG4gIHZhciBmcm9tTGlzdCA9IGZ1bmN0aW9uKEMsIGxpc3Qpe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsIGxlbmd0aCA9IGxpc3QubGVuZ3RoXG4gICAgICAsIHJlc3VsdCA9IGFsbG9jYXRlKEMsIGxlbmd0aCk7XG4gICAgd2hpbGUobGVuZ3RoID4gaW5kZXgpcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24oaXQsIGtleSwgaW50ZXJuYWwpe1xuICAgIGRQKGl0LCBrZXksIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLl9kW2ludGVybmFsXTsgfX0pO1xuICB9O1xuXG4gIHZhciAkZnJvbSA9IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qLCBtYXBmbiwgdGhpc0FyZyAqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChzb3VyY2UpXG4gICAgICAsIGFMZW4gICAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIG1hcGZuICAgPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICAgLCBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZFxuICAgICAgLCBpdGVyRm4gID0gZ2V0SXRlckZuKE8pXG4gICAgICAsIGksIGxlbmd0aCwgdmFsdWVzLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIWlzQXJyYXlJdGVyKGl0ZXJGbikpe1xuICAgICAgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHZhbHVlcyA9IFtdLCBpID0gMDsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpKyspe1xuICAgICAgICB2YWx1ZXMucHVzaChzdGVwLnZhbHVlKTtcbiAgICAgIH0gTyA9IHZhbHVlcztcbiAgICB9XG4gICAgaWYobWFwcGluZyAmJiBhTGVuID4gMiltYXBmbiA9IGN0eChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICBmb3IoaSA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKSwgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTsgbGVuZ3RoID4gaTsgaSsrKXtcbiAgICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyICRvZiA9IGZ1bmN0aW9uIG9mKC8qLi4uaXRlbXMqLyl7XG4gICAgdmFyIGluZGV4ICA9IDBcbiAgICAgICwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpO1xuICAgIHdoaWxlKGxlbmd0aCA+IGluZGV4KXJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG4gIHZhciBUT19MT0NBTEVfQlVHID0gISFVaW50OEFycmF5ICYmIGZhaWxzKGZ1bmN0aW9uKCl7IGFycmF5VG9Mb2NhbGVTdHJpbmcuY2FsbChuZXcgVWludDhBcnJheSgxKSk7IH0pO1xuXG4gIHZhciAkdG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpe1xuICAgIHJldHVybiBhcnJheVRvTG9jYWxlU3RyaW5nLmFwcGx5KFRPX0xPQ0FMRV9CVUcgPyBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcykpIDogdmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdmFyIHByb3RvID0ge1xuICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiwgZW5kICovKXtcbiAgICAgIHJldHVybiBhcnJheUNvcHlXaXRoaW4uY2FsbCh2YWxpZGF0ZSh0aGlzKSwgdGFyZ2V0LCBzdGFydCwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyosIHRoaXNBcmcgKi8pe1xuICAgICAgcmV0dXJuIGFycmF5RXZlcnkodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyosIHN0YXJ0LCBlbmQgKi8peyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlGaWxsLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5RmlsdGVyKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLFxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpO1xuICAgIH0sXG4gICAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUgLyosIHRoaXNBcmcgKi8pe1xuICAgICAgcmV0dXJuIGFycmF5RmluZCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChwcmVkaWNhdGUgLyosIHRoaXNBcmcgKi8pe1xuICAgICAgcmV0dXJuIGFycmF5RmluZEluZGV4KHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICBhcnJheUZvckVhY2godmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovKXtcbiAgICAgIHJldHVybiBhcnJheUluZGV4T2YodmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hFbGVtZW50IC8qLCBmcm9tSW5kZXggKi8pe1xuICAgICAgcmV0dXJuIGFycmF5SW5jbHVkZXModmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qLCBmcm9tSW5kZXggKi8peyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlMYXN0SW5kZXhPZi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1hcDogZnVuY3Rpb24gbWFwKG1hcGZuIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIHJldHVybiAkbWFwKHZhbGlkYXRlKHRoaXMpLCBtYXBmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiwgaW5pdGlhbFZhbHVlICovKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyosIGluaXRpYWxWYWx1ZSAqLyl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZVJpZ2h0LmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpe1xuICAgICAgdmFyIHRoYXQgICA9IHRoaXNcbiAgICAgICAgLCBsZW5ndGggPSB2YWxpZGF0ZSh0aGF0KS5sZW5ndGhcbiAgICAgICAgLCBtaWRkbGUgPSBNYXRoLmZsb29yKGxlbmd0aCAvIDIpXG4gICAgICAgICwgaW5kZXggID0gMFxuICAgICAgICAsIHZhbHVlO1xuICAgICAgd2hpbGUoaW5kZXggPCBtaWRkbGUpe1xuICAgICAgICB2YWx1ZSAgICAgICAgID0gdGhhdFtpbmRleF07XG4gICAgICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTtcbiAgICAgICAgdGhhdFtsZW5ndGhdICA9IHZhbHVlO1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9LFxuICAgIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlTb21lKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbil7XG4gICAgICByZXR1cm4gYXJyYXlTb3J0LmNhbGwodmFsaWRhdGUodGhpcyksIGNvbXBhcmVmbik7XG4gICAgfSxcbiAgICBzdWJhcnJheTogZnVuY3Rpb24gc3ViYXJyYXkoYmVnaW4sIGVuZCl7XG4gICAgICB2YXIgTyAgICAgID0gdmFsaWRhdGUodGhpcylcbiAgICAgICAgLCBsZW5ndGggPSBPLmxlbmd0aFxuICAgICAgICAsICRiZWdpbiA9IHRvSW5kZXgoYmVnaW4sIGxlbmd0aCk7XG4gICAgICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSkoXG4gICAgICAgIE8uYnVmZmVyLFxuICAgICAgICBPLmJ5dGVPZmZzZXQgKyAkYmVnaW4gKiBPLkJZVEVTX1BFUl9FTEVNRU5ULFxuICAgICAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0luZGV4KGVuZCwgbGVuZ3RoKSkgLSAkYmVnaW4pXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgJHNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCl7XG4gICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcyksIHN0YXJ0LCBlbmQpKTtcbiAgfTtcblxuICB2YXIgJHNldCA9IGZ1bmN0aW9uIHNldChhcnJheUxpa2UgLyosIG9mZnNldCAqLyl7XG4gICAgdmFsaWRhdGUodGhpcyk7XG4gICAgdmFyIG9mZnNldCA9IHRvT2Zmc2V0KGFyZ3VtZW50c1sxXSwgMSlcbiAgICAgICwgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICAgICwgc3JjICAgID0gdG9PYmplY3QoYXJyYXlMaWtlKVxuICAgICAgLCBsZW4gICAgPSB0b0xlbmd0aChzcmMubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSAwO1xuICAgIGlmKGxlbiArIG9mZnNldCA+IGxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgd2hpbGUoaW5kZXggPCBsZW4pdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107XG4gIH07XG5cbiAgdmFyICRpdGVyYXRvcnMgPSB7XG4gICAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpe1xuICAgICAgcmV0dXJuIGFycmF5RW50cmllcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIGtleXM6IGZ1bmN0aW9uIGtleXMoKXtcbiAgICAgIHJldHVybiBhcnJheUtleXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpe1xuICAgICAgcmV0dXJuIGFycmF5VmFsdWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaXNUQUluZGV4ID0gZnVuY3Rpb24odGFyZ2V0LCBrZXkpe1xuICAgIHJldHVybiBpc09iamVjdCh0YXJnZXQpXG4gICAgICAmJiB0YXJnZXRbVFlQRURfQVJSQVldXG4gICAgICAmJiB0eXBlb2Yga2V5ICE9ICdzeW1ib2wnXG4gICAgICAmJiBrZXkgaW4gdGFyZ2V0XG4gICAgICAmJiBTdHJpbmcoK2tleSkgPT0gU3RyaW5nKGtleSk7XG4gIH07XG4gIHZhciAkZ2V0RGVzYyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSl7XG4gICAgcmV0dXJuIGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICA/IHByb3BlcnR5RGVzYygyLCB0YXJnZXRba2V5XSlcbiAgICAgIDogZ09QRCh0YXJnZXQsIGtleSk7XG4gIH07XG4gIHZhciAkc2V0RGVzYyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjKXtcbiAgICBpZihpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgJiYgaXNPYmplY3QoZGVzYylcbiAgICAgICYmIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnZ2V0JylcbiAgICAgICYmICFoYXMoZGVzYywgJ3NldCcpXG4gICAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICAgJiYgIWRlc2MuY29uZmlndXJhYmxlXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnd3JpdGFibGUnKSB8fCBkZXNjLndyaXRhYmxlKVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ2VudW1lcmFibGUnKSB8fCBkZXNjLmVudW1lcmFibGUpXG4gICAgKXtcbiAgICAgIHRhcmdldFtrZXldID0gZGVzYy52YWx1ZTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHJldHVybiBkUCh0YXJnZXQsIGtleSwgZGVzYyk7XG4gIH07XG5cbiAgaWYoIUFMTF9DT05TVFJVQ1RPUlMpe1xuICAgICRHT1BELmYgPSAkZ2V0RGVzYztcbiAgICAkRFAuZiAgID0gJHNldERlc2M7XG4gIH1cblxuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFBTExfQ09OU1RSVUNUT1JTLCAnT2JqZWN0Jywge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldERlc2MsXG4gICAgZGVmaW5lUHJvcGVydHk6ICAgICAgICAgICAkc2V0RGVzY1xuICB9KTtcblxuICBpZihmYWlscyhmdW5jdGlvbigpeyBhcnJheVRvU3RyaW5nLmNhbGwoe30pOyB9KSl7XG4gICAgYXJyYXlUb1N0cmluZyA9IGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciAkVHlwZWRBcnJheVByb3RvdHlwZSQgPSByZWRlZmluZUFsbCh7fSwgcHJvdG8pO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsICRpdGVyYXRvcnMpO1xuICBoaWRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgSVRFUkFUT1IsICRpdGVyYXRvcnMudmFsdWVzKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCB7XG4gICAgc2xpY2U6ICAgICAgICAgICRzbGljZSxcbiAgICBzZXQ6ICAgICAgICAgICAgJHNldCxcbiAgICBjb25zdHJ1Y3RvcjogICAgZnVuY3Rpb24oKXsgLyogbm9vcCAqLyB9LFxuICAgIHRvU3RyaW5nOiAgICAgICBhcnJheVRvU3RyaW5nLFxuICAgIHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmdcbiAgfSk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdidWZmZXInLCAnYicpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZU9mZnNldCcsICdvJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlTGVuZ3RoJywgJ2wnKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2xlbmd0aCcsICdlJyk7XG4gIGRQKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgVEFHLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpc1tUWVBFRF9BUlJBWV07IH1cbiAgfSk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIEJZVEVTLCB3cmFwcGVyLCBDTEFNUEVEKXtcbiAgICBDTEFNUEVEID0gISFDTEFNUEVEO1xuICAgIHZhciBOQU1FICAgICAgID0gS0VZICsgKENMQU1QRUQgPyAnQ2xhbXBlZCcgOiAnJykgKyAnQXJyYXknXG4gICAgICAsIElTTlRfVUlOVDggPSBOQU1FICE9ICdVaW50OEFycmF5J1xuICAgICAgLCBHRVRURVIgICAgID0gJ2dldCcgKyBLRVlcbiAgICAgICwgU0VUVEVSICAgICA9ICdzZXQnICsgS0VZXG4gICAgICAsIFR5cGVkQXJyYXkgPSBnbG9iYWxbTkFNRV1cbiAgICAgICwgQmFzZSAgICAgICA9IFR5cGVkQXJyYXkgfHwge31cbiAgICAgICwgVEFDICAgICAgICA9IFR5cGVkQXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoVHlwZWRBcnJheSlcbiAgICAgICwgRk9SQ0VEICAgICA9ICFUeXBlZEFycmF5IHx8ICEkdHlwZWQuQUJWXG4gICAgICAsIE8gICAgICAgICAgPSB7fVxuICAgICAgLCBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheSAmJiBUeXBlZEFycmF5W1BST1RPVFlQRV07XG4gICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uKHRoYXQsIGluZGV4KXtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIHJldHVybiBkYXRhLnZbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbih0aGF0LCBpbmRleCwgdmFsdWUpe1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgaWYoQ0xBTVBFRCl2YWx1ZSA9ICh2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUpKSA8IDAgPyAwIDogdmFsdWUgPiAweGZmID8gMHhmZiA6IHZhbHVlICYgMHhmZjtcbiAgICAgIGRhdGEudltTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIHZhbHVlLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24odGhhdCwgaW5kZXgpe1xuICAgICAgZFAodGhhdCwgaW5kZXgsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpe1xuICAgICAgICAgIHJldHVybiBnZXR0ZXIodGhpcywgaW5kZXgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKXtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpe1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUsICdfZCcpO1xuICAgICAgICB2YXIgaW5kZXggID0gMFxuICAgICAgICAgICwgb2Zmc2V0ID0gMFxuICAgICAgICAgICwgYnVmZmVyLCBieXRlTGVuZ3RoLCBsZW5ndGgsIGtsYXNzO1xuICAgICAgICBpZighaXNPYmplY3QoZGF0YSkpe1xuICAgICAgICAgIGxlbmd0aCAgICAgPSBzdHJpY3RUb0xlbmd0aChkYXRhLCB0cnVlKVxuICAgICAgICAgIGJ5dGVMZW5ndGggPSBsZW5ndGggKiBCWVRFUztcbiAgICAgICAgICBidWZmZXIgICAgID0gbmV3ICRBcnJheUJ1ZmZlcihieXRlTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIGlmKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpe1xuICAgICAgICAgIGJ1ZmZlciA9IGRhdGE7XG4gICAgICAgICAgb2Zmc2V0ID0gdG9PZmZzZXQoJG9mZnNldCwgQllURVMpO1xuICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGlmKCRsZW5ndGggPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICBpZigkbGVuICUgQllURVMpdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9ICRsZW4gLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZihieXRlTGVuZ3RoIDwgMCl0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSB0b0xlbmd0aCgkbGVuZ3RoKSAqIEJZVEVTO1xuICAgICAgICAgICAgaWYoYnl0ZUxlbmd0aCArIG9mZnNldCA+ICRsZW4pdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW5ndGggPSBieXRlTGVuZ3RoIC8gQllURVM7XG4gICAgICAgIH0gZWxzZSBpZihUWVBFRF9BUlJBWSBpbiBkYXRhKXtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSh0aGF0LCAnX2QnLCB7XG4gICAgICAgICAgYjogYnVmZmVyLFxuICAgICAgICAgIG86IG9mZnNldCxcbiAgICAgICAgICBsOiBieXRlTGVuZ3RoLFxuICAgICAgICAgIGU6IGxlbmd0aCxcbiAgICAgICAgICB2OiBuZXcgJERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlKGluZGV4IDwgbGVuZ3RoKWFkZEVsZW1lbnQodGhhdCwgaW5kZXgrKyk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBjcmVhdGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkKTtcbiAgICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgVHlwZWRBcnJheSk7XG4gICAgfSBlbHNlIGlmKCEkaXRlckRldGVjdChmdW5jdGlvbihpdGVyKXtcbiAgICAgIC8vIFY4IHdvcmtzIHdpdGggaXRlcmF0b3JzLCBidXQgZmFpbHMgaW4gbWFueSBvdGhlciBjYXNlc1xuICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQ1NTJcbiAgICAgIG5ldyBUeXBlZEFycmF5KG51bGwpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoaXRlcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSwgdHJ1ZSkpe1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24odGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCl7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSk7XG4gICAgICAgIHZhciBrbGFzcztcbiAgICAgICAgLy8gYHdzYCBtb2R1bGUgYnVnLCB0ZW1wb3JhcmlseSByZW1vdmUgdmFsaWRhdGlvbiBsZW5ndGggZm9yIFVpbnQ4QXJyYXlcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvcHVsbC82NDVcbiAgICAgICAgaWYoIWlzT2JqZWN0KGRhdGEpKXJldHVybiBuZXcgQmFzZShzdHJpY3RUb0xlbmd0aChkYXRhLCBJU05UX1VJTlQ4KSk7XG4gICAgICAgIGlmKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpe1xuICAgICAgICAgIHJldHVybiAkbGVuZ3RoICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpLCAkbGVuZ3RoKVxuICAgICAgICAgICAgOiAkb2Zmc2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbmV3IEJhc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoVFlQRURfQVJSQVkgaW4gZGF0YSlyZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBhcnJheUZvckVhY2goVEFDICE9PSBGdW5jdGlvbi5wcm90b3R5cGUgPyBnT1BOKEJhc2UpLmNvbmNhdChnT1BOKFRBQykpIDogZ09QTihCYXNlKSwgZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgaWYoIShrZXkgaW4gVHlwZWRBcnJheSkpaGlkZShUeXBlZEFycmF5LCBrZXksIEJhc2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IFR5cGVkQXJyYXlQcm90b3R5cGU7XG4gICAgICBpZighTElCUkFSWSlUeXBlZEFycmF5UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHlwZWRBcnJheTtcbiAgICB9XG4gICAgdmFyICRuYXRpdmVJdGVyYXRvciAgID0gVHlwZWRBcnJheVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICAgICwgQ09SUkVDVF9JVEVSX05BTUUgPSAhISRuYXRpdmVJdGVyYXRvciAmJiAoJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gJ3ZhbHVlcycgfHwgJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gdW5kZWZpbmVkKVxuICAgICAgLCAkaXRlcmF0b3IgICAgICAgICA9ICRpdGVyYXRvcnMudmFsdWVzO1xuICAgIGhpZGUoVHlwZWRBcnJheSwgVFlQRURfQ09OU1RSVUNUT1IsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVFlQRURfQVJSQVksIE5BTUUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBERUZfQ09OU1RSVUNUT1IsIFR5cGVkQXJyYXkpO1xuXG4gICAgaWYoQ0xBTVBFRCA/IG5ldyBUeXBlZEFycmF5KDEpW1RBR10gIT0gTkFNRSA6ICEoVEFHIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKXtcbiAgICAgIGRQKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRBRywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBOQU1FOyB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPW05BTUVdID0gVHlwZWRBcnJheTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKFR5cGVkQXJyYXkgIT0gQmFzZSksIE8pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMsIE5BTUUsIHtcbiAgICAgIEJZVEVTX1BFUl9FTEVNRU5UOiBCWVRFUyxcbiAgICAgIGZyb206ICRmcm9tLFxuICAgICAgb2Y6ICRvZlxuICAgIH0pO1xuXG4gICAgaWYoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSloaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCwgTkFNRSwgcHJvdG8pO1xuXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogRk9SQ0VEX1NFVCwgTkFNRSwge3NldDogJHNldH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhQ09SUkVDVF9JVEVSX05BTUUsIE5BTUUsICRpdGVyYXRvcnMpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nKSwgTkFNRSwge3RvU3RyaW5nOiBhcnJheVRvU3RyaW5nfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgICBuZXcgVHlwZWRBcnJheSgxKS5zbGljZSgpO1xuICAgIH0pLCBOQU1FLCB7c2xpY2U6ICRzbGljZX0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24oKXtcbiAgICAgIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgVHlwZWRBcnJheShbMSwgMl0pLnRvTG9jYWxlU3RyaW5nKClcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xuICAgIH0pKSwgTkFNRSwge3RvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmd9KTtcblxuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IENPUlJFQ1RfSVRFUl9OQU1FID8gJG5hdGl2ZUl0ZXJhdG9yIDogJGl0ZXJhdG9yO1xuICAgIGlmKCFMSUJSQVJZICYmICFDT1JSRUNUX0lURVJfTkFNRSloaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIElURVJBVE9SLCAkaXRlcmF0b3IpO1xuICB9O1xufSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8gPSBPYmplY3QoaXQpO1xuICByZXR1cm4gT1tJVEVSQVRPUl0gIT09IHVuZGVmaW5lZFxuICAgIHx8ICdAQGl0ZXJhdG9yJyBpbiBPXG4gICAgfHwgSXRlcmF0b3JzLmhhc093blByb3BlcnR5KGNsYXNzb2YoTykpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLmlzLWl0ZXJhYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjIxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQ4JywgMSwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OENsYW1wZWRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MTYnLCAyLCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDE2QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDE2LWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjI0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MTYnLCAyLCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDMyJywgNCwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDMyJywgNCwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjI3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDMyJywgNCwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0Zsb2F0NjQnLCA4LCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0NjRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgX2FwcGx5ICA9IEZ1bmN0aW9uLmFwcGx5O1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCl7XG4gICAgcmV0dXJuIF9hcHBseS5jYWxsKHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuMiBSZWZsZWN0LmNvbnN0cnVjdCh0YXJnZXQsIGFyZ3VtZW50c0xpc3QgWywgbmV3VGFyZ2V0XSlcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGNyZWF0ZSAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgaXNPYmplY3QgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBiaW5kICAgICAgPSByZXF1aXJlKCcuL19iaW5kJyk7XG5cbi8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50c1xuLy8gRkYgTmlnaHRseSBzZXRzIHRoaXJkIGFyZ3VtZW50IGFzIGBuZXcudGFyZ2V0YCwgYnV0IGRvZXMgbm90IGNyZWF0ZSBgdGhpc2AgZnJvbSBpdFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKFJlZmxlY3QuY29uc3RydWN0KGZ1bmN0aW9uKCl7fSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiwgbmV3VGFyZ2V0Ki8pe1xuICAgIGFGdW5jdGlvbihUYXJnZXQpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IGFGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmKFRhcmdldCA9PSBuZXdUYXJnZXQpe1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIGlmKGFyZ3MgIT0gdW5kZWZpbmVkKXN3aXRjaChhbk9iamVjdChhcmdzKS5sZW5ndGgpe1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0O1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byAgICA9IG5ld1RhcmdldC5wcm90b3R5cGVcbiAgICAgICwgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKVxuICAgICAgLCByZXN1bHQgICA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMjMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGRQLmYoe30sIDEsIHt2YWx1ZTogMX0pLCAxLCB7dmFsdWU6IDJ9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShwcm9wZXJ0eUtleSwgdHJ1ZSk7XG4gICAgYW5PYmplY3QoYXR0cmlidXRlcyk7XG4gICAgdHJ5IHtcbiAgICAgIGRQLmYodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5LmpzXG4gKiogbW9kdWxlIGlkID0gMjMyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBnT1BEICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZlxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHZhciBkZXNjID0gZ09QRChhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gICAgcmV0dXJuIGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlID8gZmFsc2UgOiBkZWxldGUgdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzXG4gKiogbW9kdWxlIGlkID0gMjMzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW10gICAgICAgLy8ga2V5c1xuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIGl0ZXJhdGVkKWtleXMucHVzaChrZXkpO1xufTtcbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoRW51bWVyYXRlLCAnT2JqZWN0JywgZnVuY3Rpb24oKXtcbiAgdmFyIHRoYXQgPSB0aGlzXG4gICAgLCBrZXlzID0gdGhhdC5fa1xuICAgICwga2V5O1xuICBkbyB7XG4gICAgaWYodGhhdC5faSA+PSBrZXlzLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICB9IHdoaWxlKCEoKGtleSA9IGtleXNbdGhhdC5faSsrXSkgaW4gdGhhdC5fdCkpO1xuICByZXR1cm4ge3ZhbHVlOiBrZXksIGRvbmU6IGZhbHNlfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCl7XG4gICAgcmV0dXJuIG5ldyBFbnVtZXJhdGUodGFyZ2V0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gMjM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wZXJ0eUtleS8qLCByZWNlaXZlciovKXtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl1cbiAgICAsIGRlc2MsIHByb3RvO1xuICBpZihhbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcilyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSlyZXR1cm4gaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgPyBkZXNjLnZhbHVlXG4gICAgOiBkZXNjLmdldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSlyZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7Z2V0OiBnZXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuNyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyIGdPUEQgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHJldHVybiBnT1BELmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuOCBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldClcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgZ2V0UHJvdG8gPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpe1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZi5qc1xuICoqIG1vZHVsZSBpZCA9IDIzN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS45IFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lmhhcy5qc1xuICoqIG1vZHVsZSBpZCA9IDIzOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMCBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpXG52YXIgJGV4cG9ydCAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYW5PYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KXtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDIzOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMSBSZWZsZWN0Lm93bktleXModGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge293bktleXM6IHJlcXVpcmUoJy4vX293bi1rZXlzJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xudmFyIGdPUE4gICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKVxuICAsIGdPUFMgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBSZWZsZWN0ICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpe1xuICB2YXIga2V5cyAgICAgICA9IGdPUE4uZihhbk9iamVjdChpdCkpXG4gICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICByZXR1cm4gZ2V0U3ltYm9scyA/IGtleXMuY29uY2F0KGdldFN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMiBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zKHRhcmdldClcbnZhciAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmKCRwcmV2ZW50RXh0ZW5zaW9ucykkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuMTMgUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViBbLCByZWNlaXZlcl0pXG52YXIgZFAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGdPUEQgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgVi8qLCByZWNlaXZlciovKXtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM11cbiAgICAsIG93bkRlc2MgID0gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KVxuICAgICwgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90bztcbiAgaWYoIW93bkRlc2Mpe1xuICAgIGlmKGlzT2JqZWN0KHByb3RvID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpe1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYoaGFzKG93bkRlc2MsICd2YWx1ZScpKXtcbiAgICBpZihvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKXJldHVybiBmYWxzZTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IgPSBnT1BELmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5KSB8fCBjcmVhdGVEZXNjKDApO1xuICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7XG4gICAgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtzZXQ6IHNldH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC5qc1xuICoqIG1vZHVsZSBpZCA9IDI0M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmKHNldFByb3RvKSRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pe1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qc1xuICoqIG1vZHVsZSBpZCA9IDI0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkaW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyosIGZyb21JbmRleCA9IDAgKi8pe1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRhdCAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3Mpe1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDI0NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkcGFkICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgcGFkU3RhcnQ6IGZ1bmN0aW9uIHBhZFN0YXJ0KG1heExlbmd0aCAvKiwgZmlsbFN0cmluZyA9ICcgJyAqLyl7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0LmpzXG4gKiogbW9kdWxlIGlkID0gMjQ3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCByZXBlYXQgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxuICAsIGRlZmluZWQgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRoYXQsIG1heExlbmd0aCwgZmlsbFN0cmluZywgbGVmdCl7XG4gIHZhciBTICAgICAgICAgICAgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAsIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoXG4gICAgLCBmaWxsU3RyICAgICAgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZylcbiAgICAsIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gIGlmKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGgpcmV0dXJuIFM7XG4gIGlmKGZpbGxTdHIgPT0gJycpZmlsbFN0ciA9ICcgJztcbiAgdmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGhcbiAgICAsIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICByZXR1cm4gbGVmdCA/IHN0cmluZ0ZpbGxlciArIFMgOiBTICsgc3RyaW5nRmlsbGVyO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcGFkLmpzXG4gKiogbW9kdWxlIGlkID0gMjQ4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRwYWQgICAgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyosIGZpbGxTdHJpbmcgPSAnICcgKi8pe1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzXG4gKiogbW9kdWxlIGlkID0gMjQ5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltTGVmdCcsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1MZWZ0KCl7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDEpO1xuICB9O1xufSwgJ3RyaW1TdGFydCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0LmpzXG4gKiogbW9kdWxlIGlkID0gMjUwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltUmlnaHQnLCBmdW5jdGlvbigkdHJpbSl7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltUmlnaHQoKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMik7XG4gIH07XG59LCAndHJpbUVuZCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodC5qc1xuICoqIG1vZHVsZSBpZCA9IDI1MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL1N0cmluZy5wcm90b3R5cGUubWF0Y2hBbGwvXHJcbnZhciAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBkZWZpbmVkICAgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKVxyXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxyXG4gICwgaXNSZWdFeHAgICAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKVxyXG4gICwgZ2V0RmxhZ3MgICAgPSByZXF1aXJlKCcuL19mbGFncycpXHJcbiAgLCBSZWdFeHBQcm90byA9IFJlZ0V4cC5wcm90b3R5cGU7XHJcblxyXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gZnVuY3Rpb24ocmVnZXhwLCBzdHJpbmcpe1xyXG4gIHRoaXMuX3IgPSByZWdleHA7XHJcbiAgdGhpcy5fcyA9IHN0cmluZztcclxufTtcclxuXHJcbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLCAnUmVnRXhwIFN0cmluZycsIGZ1bmN0aW9uIG5leHQoKXtcclxuICB2YXIgbWF0Y2ggPSB0aGlzLl9yLmV4ZWModGhpcy5fcyk7XHJcbiAgcmV0dXJuIHt2YWx1ZTogbWF0Y2gsIGRvbmU6IG1hdGNoID09PSBudWxsfTtcclxufSk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcclxuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKXtcclxuICAgIGRlZmluZWQodGhpcyk7XHJcbiAgICBpZighaXNSZWdFeHAocmVnZXhwKSl0aHJvdyBUeXBlRXJyb3IocmVnZXhwICsgJyBpcyBub3QgYSByZWdleHAhJyk7XHJcbiAgICB2YXIgUyAgICAgPSBTdHJpbmcodGhpcylcclxuICAgICAgLCBmbGFncyA9ICdmbGFncycgaW4gUmVnRXhwUHJvdG8gPyBTdHJpbmcocmVnZXhwLmZsYWdzKSA6IGdldEZsYWdzLmNhbGwocmVnZXhwKVxyXG4gICAgICAsIHJ4ICAgID0gbmV3IFJlZ0V4cChyZWdleHAuc291cmNlLCB+ZmxhZ3MuaW5kZXhPZignZycpID8gZmxhZ3MgOiAnZycgKyBmbGFncyk7XHJcbiAgICByeC5sYXN0SW5kZXggPSB0b0xlbmd0aChyZWdleHAubGFzdEluZGV4KTtcclxuICAgIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKHJ4LCBTKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMjUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xudmFyICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBvd25LZXlzICAgICAgICA9IHJlcXVpcmUoJy4vX293bi1rZXlzJylcbiAgLCB0b0lPYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGdPUEQgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCl7XG4gICAgdmFyIE8gICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICAgLCBnZXREZXNjID0gZ09QRC5mXG4gICAgICAsIGtleXMgICAgPSBvd25LZXlzKE8pXG4gICAgICAsIHJlc3VsdCAgPSB7fVxuICAgICAgLCBpICAgICAgID0gMFxuICAgICAgLCBrZXksIEQ7XG4gICAgd2hpbGUoa2V5cy5sZW5ndGggPiBpKWNyZWF0ZVByb3BlcnR5KHJlc3VsdCwga2V5ID0ga2V5c1tpKytdLCBnZXREZXNjKE8sIGtleSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qc1xuICoqIG1vZHVsZSBpZCA9IDI1M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHZhbHVlcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKGZhbHNlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKGl0KXtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzXG4gKiogbW9kdWxlIGlkID0gMjU0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZ2V0S2V5cyAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGlzRW51bSAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc0VudHJpZXMpe1xuICByZXR1cm4gZnVuY3Rpb24oaXQpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoaXQpXG4gICAgICAsIGtleXMgICA9IGdldEtleXMoTylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaSAgICAgID0gMFxuICAgICAgLCByZXN1bHQgPSBbXVxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUobGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChPLCBrZXkgPSBrZXlzW2krK10pKXtcbiAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC10by1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDI1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRlbnRyaWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKGl0KXtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b09iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxyXG4gICwgYUZ1bmN0aW9uICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXHJcbiAgLCAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcclxuXHJcbi8vIEIuMi4yLjIgT2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcilcclxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XHJcbiAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpe1xyXG4gICAgJGRlZmluZVByb3BlcnR5LmYodG9PYmplY3QodGhpcyksIFAsIHtnZXQ6IGFGdW5jdGlvbihnZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9KTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLWdldHRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI1N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gRm9yY2VkIHJlcGxhY2VtZW50IHByb3RvdHlwZSBhY2Nlc3NvcnMgbWV0aG9kc1xyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKXx8ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XHJcbiAgdmFyIEsgPSBNYXRoLnJhbmRvbSgpO1xyXG4gIC8vIEluIEZGIHRocm93cyBvbmx5IGRlZmluZSBtZXRob2RzXHJcbiAgX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG51bGwsIEssIGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovfSk7XHJcbiAgZGVsZXRlIHJlcXVpcmUoJy4vX2dsb2JhbCcpW0tdO1xyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWZvcmNlZC1wYW0uanNcbiAqKiBtb2R1bGUgaWQgPSAyNThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b09iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxyXG4gICwgYUZ1bmN0aW9uICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXHJcbiAgLCAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcclxuXHJcbi8vIEIuMi4yLjMgT2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKFAsIHNldHRlcilcclxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XHJcbiAgX19kZWZpbmVTZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpe1xyXG4gICAgJGRlZmluZVByb3BlcnR5LmYodG9PYmplY3QodGhpcyksIFAsIHtzZXQ6IGFGdW5jdGlvbihzZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9KTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI1OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIHRvT2JqZWN0ICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCB0b1ByaW1pdGl2ZSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxyXG4gICwgZ2V0UHJvdG90eXBlT2YgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXHJcbiAgLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XHJcblxyXG4vLyBCLjIuMi40IE9iamVjdC5wcm90b3R5cGUuX19sb29rdXBHZXR0ZXJfXyhQKVxyXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcclxuICBfX2xvb2t1cEdldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cEdldHRlcl9fKFApe1xyXG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKVxyXG4gICAgICAsIEsgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKVxyXG4gICAgICAsIEQ7XHJcbiAgICBkbyB7XHJcbiAgICAgIGlmKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpcmV0dXJuIEQuZ2V0O1xyXG4gICAgfSB3aGlsZShPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjYwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgdG9PYmplY3QgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcclxuICAsIHRvUHJpbWl0aXZlICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXHJcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcclxuICAsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcclxuXHJcbi8vIEIuMi4yLjUgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cFNldHRlcl9fKFApXHJcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xyXG4gIF9fbG9va3VwU2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwU2V0dGVyX18oUCl7XHJcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpXHJcbiAgICAgICwgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpXHJcbiAgICAgICwgRDtcclxuICAgIGRvIHtcclxuICAgICAgaWYoRCA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBLKSlyZXR1cm4gRC5zZXQ7XHJcbiAgICB9IHdoaWxlKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1zZXR0ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyNjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ01hcCcsIHt0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAudG8tanNvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDI2MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBmcm9tICAgID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe1xuICAgIGlmKGNsYXNzb2YodGhpcykgIT0gTkFNRSl0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMjYzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyLCBJVEVSQVRPUil7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yT2YoaXRlciwgZmFsc2UsIHJlc3VsdC5wdXNoLCByZXN1bHQsIElURVJBVE9SKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktZnJvbS1pdGVyYWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI2NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnU2V0Jywge3RvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ1NldCcpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMjY1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLWdsb2JhbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTeXN0ZW0nLCB7Z2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsLmpzXG4gKiogbW9kdWxlIGlkID0gMjY2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLWlzLWVycm9yXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgY29mICAgICA9IHJlcXVpcmUoJy4vX2NvZicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0Vycm9yJywge1xuICBpc0Vycm9yOiBmdW5jdGlvbiBpc0Vycm9yKGl0KXtcbiAgICByZXR1cm4gY29mKGl0KSA9PT0gJ0Vycm9yJztcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LmVycm9yLmlzLWVycm9yLmpzXG4gKiogbW9kdWxlIGlkID0gMjY3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpYWRkaDogZnVuY3Rpb24gaWFkZGgoeDAsIHgxLCB5MCwgeTEpe1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMFxuICAgICAgLCAkeDEgPSB4MSA+Pj4gMFxuICAgICAgLCAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pYWRkaC5qc1xuICoqIG1vZHVsZSBpZCA9IDI2OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaXN1Ymg6IGZ1bmN0aW9uIGlzdWJoKHgwLCB4MSwgeTAsIHkxKXtcbiAgICB2YXIgJHgwID0geDAgPj4+IDBcbiAgICAgICwgJHgxID0geDEgPj4+IDBcbiAgICAgICwgJHkwID0geTAgPj4+IDA7XG4gICAgcmV0dXJuICR4MSAtICh5MSA+Pj4gMCkgLSAoKH4keDAgJiAkeTAgfCB+KCR4MCBeICR5MCkgJiAkeDAgLSAkeTAgPj4+IDApID4+PiAzMSkgfCAwO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qc1xuICoqIG1vZHVsZSBpZCA9IDI2OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaW11bGg6IGZ1bmN0aW9uIGltdWxoKHUsIHYpe1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmZcbiAgICAgICwgJHUgPSArdVxuICAgICAgLCAkdiA9ICt2XG4gICAgICAsIHUwID0gJHUgJiBVSU5UMTZcbiAgICAgICwgdjAgPSAkdiAmIFVJTlQxNlxuICAgICAgLCB1MSA9ICR1ID4+IDE2XG4gICAgICAsIHYxID0gJHYgPj4gMTZcbiAgICAgICwgdCAgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+PiAxNik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzXG4gKiogbW9kdWxlIGlkID0gMjcwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB1bXVsaDogZnVuY3Rpb24gdW11bGgodSwgdil7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZlxuICAgICAgLCAkdSA9ICt1XG4gICAgICAsICR2ID0gK3ZcbiAgICAgICwgdTAgPSAkdSAmIFVJTlQxNlxuICAgICAgLCB2MCA9ICR2ICYgVUlOVDE2XG4gICAgICAsIHUxID0gJHUgPj4+IDE2XG4gICAgICAsIHYxID0gJHYgPj4+IDE2XG4gICAgICAsIHQgID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTtcbiAgICByZXR1cm4gdTEgKiB2MSArICh0ID4+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+PiAxNik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoLmpzXG4gKiogbW9kdWxlIGlkID0gMjcxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5XG4gICwgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHtkZWZpbmVNZXRhZGF0YTogZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgdGFyZ2V0S2V5KXtcbiAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdG9NZXRhS2V5KHRhcmdldEtleSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIE1hcCAgICAgPSByZXF1aXJlKCcuL2VzNi5tYXAnKVxuICAsICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHNoYXJlZCAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnbWV0YWRhdGEnKVxuICAsIHN0b3JlICAgPSBzaGFyZWQuc3RvcmUgfHwgKHNoYXJlZC5zdG9yZSA9IG5ldyAocmVxdWlyZSgnLi9lczYud2Vhay1tYXAnKSkpO1xuXG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IGZ1bmN0aW9uKHRhcmdldCwgdGFyZ2V0S2V5LCBjcmVhdGUpe1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgaWYoIXRhcmdldE1ldGFkYXRhKXtcbiAgICBpZighY3JlYXRlKXJldHVybiB1bmRlZmluZWQ7XG4gICAgc3RvcmUuc2V0KHRhcmdldCwgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgTWFwKTtcbiAgfVxuICB2YXIga2V5TWV0YWRhdGEgPSB0YXJnZXRNZXRhZGF0YS5nZXQodGFyZ2V0S2V5KTtcbiAgaWYoIWtleU1ldGFkYXRhKXtcbiAgICBpZighY3JlYXRlKXJldHVybiB1bmRlZmluZWQ7XG4gICAgdGFyZ2V0TWV0YWRhdGEuc2V0KHRhcmdldEtleSwga2V5TWV0YWRhdGEgPSBuZXcgTWFwKTtcbiAgfSByZXR1cm4ga2V5TWV0YWRhdGE7XG59O1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBmdW5jdGlvbihNZXRhZGF0YUtleSwgTywgUCl7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpO1xuICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogbWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IGZ1bmN0aW9uKE1ldGFkYXRhS2V5LCBPLCBQKXtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKXtcbiAgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCB0cnVlKS5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xufTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uKHRhcmdldCwgdGFyZ2V0S2V5KXtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHRhcmdldEtleSwgZmFsc2UpXG4gICAgLCBrZXlzICAgICAgICA9IFtdO1xuICBpZihtZXRhZGF0YU1hcCltZXRhZGF0YU1hcC5mb3JFYWNoKGZ1bmN0aW9uKF8sIGtleSl7IGtleXMucHVzaChrZXkpOyB9KTtcbiAgcmV0dXJuIGtleXM7XG59O1xudmFyIHRvTWV0YUtleSA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcbnZhciBleHAgPSBmdW5jdGlvbihPKXtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgTyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3RvcmU6IHN0b3JlLFxuICBtYXA6IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAsXG4gIGhhczogb3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICBzZXQ6IG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gIGtleXM6IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICBrZXk6IHRvTWV0YUtleSxcbiAgZXhwOiBleHBcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjczXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5XG4gICwgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IG1ldGFkYXRhLm1hcFxuICAsIHN0b3JlICAgICAgICAgICAgICAgICAgPSBtZXRhZGF0YS5zdG9yZTtcblxubWV0YWRhdGEuZXhwKHtkZWxldGVNZXRhZGF0YTogZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgdmFyIHRhcmdldEtleSAgID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKVxuICAgICwgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSwgZmFsc2UpO1xuICBpZihtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkIHx8ICFtZXRhZGF0YU1hcFsnZGVsZXRlJ10obWV0YWRhdGFLZXkpKXJldHVybiBmYWxzZTtcbiAgaWYobWV0YWRhdGFNYXAuc2l6ZSlyZXR1cm4gdHJ1ZTtcbiAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7XG4gIHRhcmdldE1ldGFkYXRhWydkZWxldGUnXSh0YXJnZXRLZXkpO1xuICByZXR1cm4gISF0YXJnZXRNZXRhZGF0YS5zaXplIHx8IHN0b3JlWydkZWxldGUnXSh0YXJnZXQpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIG1ldGFkYXRhICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpXG4gICwgYW5PYmplY3QgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0UHJvdG90eXBlT2YgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXNcbiAgLCBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0XG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbihNZXRhZGF0YUtleSwgTywgUCl7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYoaGFzT3duKXJldHVybiBvcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IHVuZGVmaW5lZDtcbn07XG5cbm1ldGFkYXRhLmV4cCh7Z2V0TWV0YWRhdGE6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyosIHRhcmdldEtleSAqLyl7XG4gIHJldHVybiBvcmRpbmFyeUdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBTZXQgICAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vZXM2LnNldCcpXG4gICwgZnJvbSAgICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1mcm9tLWl0ZXJhYmxlJylcbiAgLCBtZXRhZGF0YSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0UHJvdG90eXBlT2YgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXNcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5TWV0YWRhdGFLZXlzID0gZnVuY3Rpb24oTywgUCl7XG4gIHZhciBvS2V5cyAgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICwgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIGlmKHBhcmVudCA9PT0gbnVsbClyZXR1cm4gb0tleXM7XG4gIHZhciBwS2V5cyAgPSBvcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICByZXR1cm4gcEtleXMubGVuZ3RoID8gb0tleXMubGVuZ3RoID8gZnJvbShuZXcgU2V0KG9LZXlzLmNvbmNhdChwS2V5cykpKSA6IHBLZXlzIDogb0tleXM7XG59O1xuXG5tZXRhZGF0YS5leHAoe2dldE1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5TWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjc2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0XG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHtnZXRPd25NZXRhZGF0YTogZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBtZXRhZGF0YS5rZXlzXG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7Z2V0T3duTWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlPd25NZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMjc4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhc1xuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXk7XG5cbnZhciBvcmRpbmFyeUhhc01ldGFkYXRhID0gZnVuY3Rpb24oTWV0YWRhdGFLZXksIE8sIFApe1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmKGhhc093bilyZXR1cm4gdHJ1ZTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IGZhbHNlO1xufTtcblxubWV0YWRhdGEuZXhwKHtoYXNNZXRhZGF0YTogZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIG1ldGFkYXRhICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpXG4gICwgYW5PYmplY3QgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhc1xuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7aGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyosIHRhcmdldEtleSAqLyl7XG4gIHJldHVybiBvcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpXG4gICAgLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjgwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleVxuICAsIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5zZXQ7XG5cbm1ldGFkYXRhLmV4cCh7bWV0YWRhdGE6IGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIHRhcmdldEtleSl7XG4gICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShcbiAgICAgIG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLFxuICAgICAgKHRhcmdldEtleSAhPT0gdW5kZWZpbmVkID8gYW5PYmplY3QgOiBhRnVuY3Rpb24pKHRhcmdldCksXG4gICAgICB0b01ldGFLZXkodGFyZ2V0S2V5KVxuICAgICk7XG4gIH07XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyODFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCAkZXhwb3J0ICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBpbnZva2UgICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBwYXJ0aWFsICAgID0gcmVxdWlyZSgnLi9fcGFydGlhbCcpXG4gICwgbmF2aWdhdG9yICA9IGdsb2JhbC5uYXZpZ2F0b3JcbiAgLCBNU0lFICAgICAgID0gISFuYXZpZ2F0b3IgJiYgL01TSUUgLlxcLi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVja1xudmFyIHdyYXAgPSBmdW5jdGlvbihzZXQpe1xuICByZXR1cm4gTVNJRSA/IGZ1bmN0aW9uKGZuLCB0aW1lIC8qLCAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gc2V0KGludm9rZShcbiAgICAgIHBhcnRpYWwsXG4gICAgICBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICB0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pXG4gICAgKSwgdGltZSk7XG4gIH0gOiBzZXQ7XG59O1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIgKyAkZXhwb3J0LkYgKiBNU0lFLCB7XG4gIHNldFRpbWVvdXQ6ICB3cmFwKGdsb2JhbC5zZXRUaW1lb3V0KSxcbiAgc2V0SW50ZXJ2YWw6IHdyYXAoZ2xvYmFsLnNldEludGVydmFsKVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qc1xuICoqIG1vZHVsZSBpZCA9IDI4MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggICAgICA9IHJlcXVpcmUoJy4vX3BhdGgnKVxuICAsIGludm9rZSAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigvKiAuLi5wYXJncyAqLyl7XG4gIHZhciBmbiAgICAgPSBhRnVuY3Rpb24odGhpcylcbiAgICAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIHBhcmdzICA9IEFycmF5KGxlbmd0aClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIF8gICAgICA9IHBhdGguX1xuICAgICwgaG9sZGVyID0gZmFsc2U7XG4gIHdoaWxlKGxlbmd0aCA+IGkpaWYoKHBhcmdzW2ldID0gYXJndW1lbnRzW2krK10pID09PSBfKWhvbGRlciA9IHRydWU7XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICAgICwgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgaiA9IDAsIGsgPSAwLCBhcmdzO1xuICAgIGlmKCFob2xkZXIgJiYgIWFMZW4pcmV0dXJuIGludm9rZShmbiwgcGFyZ3MsIHRoYXQpO1xuICAgIGFyZ3MgPSBwYXJncy5zbGljZSgpO1xuICAgIGlmKGhvbGRlcilmb3IoO2xlbmd0aCA+IGo7IGorKylpZihhcmdzW2pdID09PSBfKWFyZ3Nbal0gPSBhcmd1bWVudHNbaysrXTtcbiAgICB3aGlsZShhTGVuID4gaylhcmdzLnB1c2goYXJndW1lbnRzW2srK10pO1xuICAgIHJldHVybiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFydGlhbC5qc1xuICoqIG1vZHVsZSBpZCA9IDI4M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGF0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDI4NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICR0YXNrICAgPSByZXF1aXJlKCcuL190YXNrJyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiwge1xuICBzZXRJbW1lZGlhdGU6ICAgJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyODVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkaXRlcmF0b3JzICAgID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKVxuICAsIHJlZGVmaW5lICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgZ2xvYmFsICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIEl0ZXJhdG9ycyAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHdrcyAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIElURVJBVE9SICAgICAgPSB3a3MoJ2l0ZXJhdG9yJylcbiAgLCBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpXG4gICwgQXJyYXlWYWx1ZXMgICA9IEl0ZXJhdG9ycy5BcnJheTtcblxuZm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG4gIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cbiAgICAsIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV1cbiAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlXG4gICAgLCBrZXk7XG4gIGlmKHByb3RvKXtcbiAgICBpZighcHJvdG9bSVRFUkFUT1JdKWhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYoIXByb3RvW1RPX1NUUklOR19UQUddKWhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGZvcihrZXkgaW4gJGl0ZXJhdG9ycylpZighcHJvdG9ba2V5XSlyZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9tYXN0ZXIvTElDRU5TRSBmaWxlLiBBblxuICogYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluXG4gKiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgaXRlcmF0b3JTeW1ib2wgPVxuICAgIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZSgob3V0ZXJGbiB8fCBHZW5lcmF0b3IpLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgdmFsdWUgaW5zdGFuY2VvZiBBd2FpdEFyZ3VtZW50YCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC4gU29tZSBtYXkgY29uc2lkZXIgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgdG9vXG4gIC8vIGN1dGVzeSwgYnV0IHRoZXkgYXJlIGN1cm11ZGdlb25zLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBBd2FpdEFyZ3VtZW50KGFyZyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gQXdhaXRBcmd1bWVudChhcmcpIHtcbiAgICB0aGlzLmFyZyA9IGFyZztcbiAgfVxuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgLy8gVGhpcyBpbnZva2UgZnVuY3Rpb24gaXMgd3JpdHRlbiBpbiBhIHN0eWxlIHRoYXQgYXNzdW1lcyBzb21lXG4gICAgLy8gY2FsbGluZyBmdW5jdGlvbiAob3IgUHJvbWlzZSkgd2lsbCBoYW5kbGUgZXhjZXB0aW9ucy5cbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZW5lcmF0b3JbbWV0aG9kXShhcmcpO1xuICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXdhaXRBcmd1bWVudFxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZSh2YWx1ZS5hcmcpLnRoZW4oaW52b2tlTmV4dCwgaW52b2tlVGhyb3cpXG4gICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzLmRvbWFpbikge1xuICAgICAgaW52b2tlID0gcHJvY2Vzcy5kb21haW4uYmluZChpbnZva2UpO1xuICAgIH1cblxuICAgIHZhciBpbnZva2VOZXh0ID0gaW52b2tlLmJpbmQoZ2VuZXJhdG9yLCBcIm5leHRcIik7XG4gICAgdmFyIGludm9rZVRocm93ID0gaW52b2tlLmJpbmQoZ2VuZXJhdG9yLCBcInRocm93XCIpO1xuICAgIHZhciBpbnZva2VSZXR1cm4gPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwicmV0dXJuXCIpO1xuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIGludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICBpZiAobWV0aG9kID09PSBcInJldHVyblwiIHx8XG4gICAgICAgICAgICAgIChtZXRob2QgPT09IFwidGhyb3dcIiAmJiBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2RdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAvLyBBIHJldHVybiBvciB0aHJvdyAod2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIHRocm93XG4gICAgICAgICAgICAvLyBtZXRob2QpIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgICB2YXIgcmV0dXJuTWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl07XG4gICAgICAgICAgICBpZiAocmV0dXJuTWV0aG9kKSB7XG4gICAgICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChyZXR1cm5NZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBhcmcpO1xuICAgICAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXR1cm4gbWV0aG9kIHRocmV3IGFuIGV4Y2VwdGlvbiwgbGV0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gcHJldmFpbCBvdmVyIHRoZSBvcmlnaW5hbCByZXR1cm4gb3IgdGhyb3cuXG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgICAgICAgIGFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIHRoZSBvdXRlciByZXR1cm4sIG5vdyB0aGF0IHRoZSBkZWxlZ2F0ZVxuICAgICAgICAgICAgICAvLyBpdGVyYXRvciBoYXMgYmVlbiB0ZXJtaW5hdGVkLlxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goXG4gICAgICAgICAgICBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2RdLFxuICAgICAgICAgICAgZGVsZWdhdGUuaXRlcmF0b3IsXG4gICAgICAgICAgICBhcmdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBMaWtlIHJldHVybmluZyBnZW5lcmF0b3IudGhyb3codW5jYXVnaHQpLCBidXQgd2l0aG91dCB0aGVcbiAgICAgICAgICAgIC8vIG92ZXJoZWFkIG9mIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwuXG4gICAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGVsZWdhdGUgZ2VuZXJhdG9yIHJhbiBhbmQgaGFuZGxlZCBpdHMgb3duIGV4Y2VwdGlvbnMgc29cbiAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIG1ldGhvZCB3YXMsIHdlIGNvbnRpbnVlIGFzIGlmIGl0IGlzXG4gICAgICAgICAgLy8gXCJuZXh0XCIgd2l0aCBhbiB1bmRlZmluZWQgYXJnLlxuICAgICAgICAgIG1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcbiAgICAgICAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcbiAgICAgICAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcbiAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9zZW50ID0gYXJnO1xuXG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkKSB7XG4gICAgICAgICAgICBjb250ZXh0LnNlbnQgPSBhcmc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oYXJnKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgICBtZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBhcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIHZhciBpbmZvID0ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGVnYXRlICYmIG1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICAgICAgICBhcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgdGhpcy5zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuICAgICAgICByZXR1cm4gISFjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEFtb25nIHRoZSB2YXJpb3VzIHRyaWNrcyBmb3Igb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWxcbiAgLy8gb2JqZWN0LCB0aGlzIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHJlbGlhYmxlIHRlY2huaXF1ZSB0aGF0IGRvZXMgbm90XG4gIC8vIHVzZSBpbmRpcmVjdCBldmFsICh3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSkuXG4gIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDpcbiAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDogdGhpc1xuKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vYmFiZWwtcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4gKiogbW9kdWxlIGlkID0gMjg3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgc2V0VGltZW91dChkcmFpblF1ZXVlLCAwKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyODhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWdFeHAuZXNjYXBlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlLmpzXG4gKiogbW9kdWxlIGlkID0gMjg5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vYmVuamFtaW5nci9SZXhFeHAuZXNjYXBlXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHJlICAgICA9IHJlcXVpcmUoJy4vX3JlcGxhY2VyJykoL1tcXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVnRXhwJywge2VzY2FwZTogZnVuY3Rpb24gZXNjYXBlKGl0KXsgcmV0dXJuICRyZShpdCk7IH19KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI5MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihyZWdFeHAsIHJlcGxhY2Upe1xuICB2YXIgcmVwbGFjZXIgPSByZXBsYWNlID09PSBPYmplY3QocmVwbGFjZSkgPyBmdW5jdGlvbihwYXJ0KXtcbiAgICByZXR1cm4gcmVwbGFjZVtwYXJ0XTtcbiAgfSA6IHJlcGxhY2U7XG4gIHJldHVybiBmdW5jdGlvbihpdCl7XG4gICAgcmV0dXJuIFN0cmluZyhpdCkucmVwbGFjZShyZWdFeHAsIHJlcGxhY2VyKTtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3JlcGxhY2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMjkxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5leHBvcnQgY29uc3QgTG9nID0gcmVxdWlyZSgnLi9zcmMvTG9nJyk7XG5leHBvcnQgY29uc3QgT2lkY0NsaWVudCA9IHJlcXVpcmUoJy4vc3JjL09pZGNDbGllbnQnKTtcbmV4cG9ydCBjb25zdCBXZWJTdG9yYWdlU3RhdGVTdG9yZSA9IHJlcXVpcmUoJy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJyk7XG5leHBvcnQgY29uc3QgSW5NZW1vcnlXZWJTdG9yYWdlID0gcmVxdWlyZSgnLi9zcmMvSW5NZW1vcnlXZWJTdG9yYWdlJyk7XG5leHBvcnQgY29uc3QgVXNlck1hbmFnZXIgPSByZXF1aXJlKCcuL3NyYy9Vc2VyTWFuYWdlcicpO1xuZXhwb3J0IGNvbnN0IEFjY2Vzc1Rva2VuRXZlbnRzID0gcmVxdWlyZSgnLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMnKTtcbmV4cG9ydCBjb25zdCBNZXRhZGF0YVNlcnZpY2UgPSByZXF1aXJlKCcuL3NyYy9NZXRhZGF0YVNlcnZpY2UnKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIExvZyxcbiAgICBPaWRjQ2xpZW50LFxuICAgIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlLFxuICAgIEluTWVtb3J5V2ViU3RvcmFnZSxcbiAgICBVc2VyTWFuYWdlcixcbiAgICBBY2Nlc3NUb2tlbkV2ZW50cyxcbiAgICBNZXRhZGF0YVNlcnZpY2Vcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2luZGV4LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxubGV0IG5vcExvZ2dlciA9IHtcbiAgICBpbmZvKCl7fSxcbiAgICB3YXJuKCl7fSxcbiAgICBlcnJvcigpe31cbn07XG5cbmNvbnN0IE5PTkUgPSAwO1xuY29uc3QgRVJST1IgPSAxO1xuY29uc3QgV0FSTiA9IDI7XG5jb25zdCBJTkZPID0gMztcblxubGV0IGxvZ2dlcjtcbmxldCBsZXZlbDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nIHtcbiAgICBzdGF0aWMgZ2V0IE5PTkUoKSB7cmV0dXJuIE5PTkV9O1xuICAgIHN0YXRpYyBnZXQgRVJST1IoKSB7cmV0dXJuIEVSUk9SfTtcbiAgICBzdGF0aWMgZ2V0IFdBUk4oKSB7cmV0dXJuIFdBUk59O1xuICAgIHN0YXRpYyBnZXQgSU5GTygpIHtyZXR1cm4gSU5GT307XG4gICAgXG4gICAgc3RhdGljIHJlc2V0KCl7XG4gICAgICAgIGxldmVsID0gSU5GTztcbiAgICAgICAgbG9nZ2VyID0gbm9wTG9nZ2VyO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0IGxldmVsKCl7XG4gICAgICAgIHJldHVybiBsZXZlbDtcbiAgICB9XG4gICAgc3RhdGljIHNldCBsZXZlbCh2YWx1ZSl7XG4gICAgICAgIGlmIChOT05FIDw9IHZhbHVlICYmIHZhbHVlIDw9IElORk8pe1xuICAgICAgICAgICAgbGV2ZWwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXQgbG9nZ2VyKCl7XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgbG9nZ2VyKHZhbHVlKXtcbiAgICAgICAgaWYgKHZhbHVlLmluZm8gJiYgdmFsdWUud2FybiAmJiB2YWx1ZS5lcnJvcil7XG4gICAgICAgICAgICBsb2dnZXIgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nZ2VyXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBpbmZvKC4uLmFyZ3Mpe1xuICAgICAgICBpZiAobGV2ZWwgPj0gSU5GTyl7XG4gICAgICAgICAgICBsb2dnZXIuaW5mby5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyB3YXJuKC4uLmFyZ3Mpe1xuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTil7XG4gICAgICAgICAgICBsb2dnZXIud2Fybi5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBlcnJvciguLi5hcmdzKXtcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SKXtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvci5hcHBseShsb2dnZXIsIEFycmF5LmZyb20oYXJncykpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5Mb2cucmVzZXQoKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Mb2cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xuaW1wb3J0IEVycm9yUmVzcG9uc2UgZnJvbSAnLi9FcnJvclJlc3BvbnNlJztcbmltcG9ydCBTaWduaW5SZXF1ZXN0IGZyb20gJy4vU2lnbmluUmVxdWVzdCc7XG5pbXBvcnQgU2lnbmluUmVzcG9uc2UgZnJvbSAnLi9TaWduaW5SZXNwb25zZSc7XG5pbXBvcnQgU2lnbm91dFJlcXVlc3QgZnJvbSAnLi9TaWdub3V0UmVxdWVzdCc7XG5pbXBvcnQgU2lnbm91dFJlc3BvbnNlIGZyb20gJy4vU2lnbm91dFJlc3BvbnNlJztcbmltcG9ydCBTaWduaW5TdGF0ZSBmcm9tICcuL1NpZ25pblN0YXRlJztcbmltcG9ydCBTdGF0ZSBmcm9tICcuL1N0YXRlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2lkY0NsaWVudCB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBpZiAoc2V0dGluZ3MgaW5zdGFuY2VvZiBPaWRjQ2xpZW50U2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IG5ldyBPaWRjQ2xpZW50U2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IF9zdGF0ZVN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5zdGF0ZVN0b3JlO1xuICAgIH1cbiAgICBnZXQgX3ZhbGlkYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudmFsaWRhdG9yO1xuICAgIH1cbiAgICBnZXQgX21ldGFkYXRhU2VydmljZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cblxuICAgIGdldCBzZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbiAgICBnZXQgbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cblxuICAgIGNyZWF0ZVNpZ25pblJlcXVlc3Qoe1xuICAgICAgICByZXNwb25zZV90eXBlLCBzY29wZSwgcmVkaXJlY3RfdXJpLCBkYXRhLFxuICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXN9ID0ge30sXG4gICAgICAgIHN0YXRlU3RvcmVcbiAgICApIHtcbiAgICAgICAgTG9nLmluZm8oXCJPaWRjQ2xpZW50LmNyZWF0ZVNpZ25pblJlcXVlc3RcIik7XG5cbiAgICAgICAgbGV0IGNsaWVudF9pZCA9IHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZDtcbiAgICAgICAgcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGUgfHwgdGhpcy5fc2V0dGluZ3MucmVzcG9uc2VfdHlwZTtcbiAgICAgICAgc2NvcGUgPSBzY29wZSB8fCB0aGlzLl9zZXR0aW5ncy5zY29wZTtcbiAgICAgICAgcmVkaXJlY3RfdXJpID0gcmVkaXJlY3RfdXJpIHx8IHRoaXMuX3NldHRpbmdzLnJlZGlyZWN0X3VyaTtcblxuICAgICAgICAvLyBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50IGFyZW4ndCBhbGxvd2VkIG9uIF9zZXR0aW5nc1xuICAgICAgICBwcm9tcHQgPSBwcm9tcHQgfHwgdGhpcy5fc2V0dGluZ3MucHJvbXB0O1xuICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLl9zZXR0aW5ncy5kaXNwbGF5O1xuICAgICAgICBtYXhfYWdlID0gbWF4X2FnZSB8fCB0aGlzLl9zZXR0aW5ncy5tYXhfYWdlO1xuICAgICAgICB1aV9sb2NhbGVzID0gdWlfbG9jYWxlcyB8fCB0aGlzLl9zZXR0aW5ncy51aV9sb2NhbGVzO1xuICAgICAgICBhY3JfdmFsdWVzID0gYWNyX3ZhbHVlcyB8fCB0aGlzLl9zZXR0aW5ncy5hY3JfdmFsdWVzO1xuICAgICAgICBcbiAgICAgICAgbGV0IGF1dGhvcml0eSA9IHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldEF1dGhvcml6YXRpb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiUmVjZWl2ZWQgYXV0aG9yaXphdGlvbiBlbmRwb2ludFwiLCB1cmwpO1xuXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBTaWduaW5SZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaSxcbiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlLFxuICAgICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgYXV0aG9yaXR5LFxuICAgICAgICAgICAgICAgIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5zZXQoc3RhdGUuaWQsIHN0YXRlLnRvU3RvcmFnZVN0cmluZygpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzU2lnbmluUmVzcG9uc2UodXJsLCBzdGF0ZVN0b3JlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbmluUmVzcG9uc2VcIik7XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IFNpZ25pblJlc3BvbnNlKHVybCk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcblxuICAgICAgICByZXR1cm4gc3RhdGVTdG9yZS5yZW1vdmUocmVzcG9uc2Uuc3RhdGUpLnRoZW4oc3RvcmVkU3RhdGVTdHJpbmcgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0ZVN0cmluZykge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHN0YXRlID0gU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmVkU3RhdGVTdHJpbmcpO1xuXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlJlY2VpdmVkIHN0YXRlIGZyb20gc3RvcmFnZTsgdmFsaWRhdGluZyByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVTaWdub3V0UmVxdWVzdCh7aWRfdG9rZW5faGludCwgZGF0YSwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpfSA9IHt9LFxuICAgICAgICBzdGF0ZVN0b3JlXG4gICAgKSB7XG4gICAgICAgIExvZy5pbmZvKFwiT2lkY0NsaWVudC5jcmVhdGVTaWdub3V0UmVxdWVzdFwiKTtcblxuICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgPSBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgfHwgdGhpcy5fc2V0dGluZ3MucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkudGhlbih1cmwgPT4ge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBlbmQgc2Vzc2lvbiBlbmRwb2ludFwiLCB1cmwpO1xuXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBTaWdub3V0UmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIGlkX3Rva2VuX2hpbnQsXG4gICAgICAgICAgICAgICAgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxuICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgc3RhdGUgPSByZXF1ZXN0LnN0YXRlO1xuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJTaWdub3V0IHJlcXVlc3QgaGFzIHN0YXRlIHRvIHBlcnNpc3RcIik7XG5cbiAgICAgICAgICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xuICAgICAgICAgICAgICAgIHN0YXRlU3RvcmUuc2V0KHN0YXRlLmlkLCBzdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm9jZXNzU2lnbm91dFJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xuICAgICAgICBMb2cuaW5mbyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25vdXRSZXNwb25zZVwiKTtcblxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2lnbm91dFJlc3BvbnNlKHVybCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiTm8gc3RhdGUgaW4gcmVzcG9uc2VcIik7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhdGVLZXkgPSByZXNwb25zZS5zdGF0ZTtcblxuICAgICAgICBzdGF0ZVN0b3JlID0gc3RhdGVTdG9yZSB8fCB0aGlzLl9zdGF0ZVN0b3JlO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZVN0b3JlLnJlbW92ZShzdGF0ZUtleSkudGhlbihzdG9yZWRTdGF0ZVN0cmluZyA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRlU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbWF0Y2hpbmcgc3RhdGUgZm91bmQgaW4gc3RvcmFnZVwiKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhzdG9yZWRTdGF0ZVN0cmluZyk7XG5cbiAgICAgICAgICAgIExvZy5pbmZvKFwiUmVjZWl2ZWQgc3RhdGUgZnJvbSBzdG9yYWdlOyB2YWxpZGF0aW5nIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZVNpZ25vdXRSZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbGVhclN0YWxlU3RhdGUoc3RhdGVTdG9yZSkge1xuICAgICAgICBMb2cuaW5mbyhcIk9pZGNDbGllbnQuY2xlYXJTdGFsZVN0YXRlXCIpO1xuXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG5cbiAgICAgICAgcmV0dXJuIFN0YXRlLmNsZWFyU3RhbGVTdGF0ZShzdGF0ZVN0b3JlLCB0aGlzLnNldHRpbmdzLnN0YWxlU3RhdGVBZ2UpO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL09pZGNDbGllbnQuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcbmltcG9ydCBSZXNwb25zZVZhbGlkYXRvciBmcm9tICcuL1Jlc3BvbnNlVmFsaWRhdG9yJztcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xuXG5jb25zdCBPaWRjTWV0YWRhdGFVcmxQYXRoID0gJy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uJztcblxuY29uc3QgRGVmYXVsdFJlc3BvbnNlVHlwZSA9IFwiaWRfdG9rZW5cIjtcbmNvbnN0IERlZmF1bHRTY29wZSA9IFwib3BlbmlkXCI7XG5jb25zdCBEZWZhdWx0U3RhbGVTdGF0ZUFnZSA9IDYwOyAvLyBzZWNvbmRzXG5jb25zdCBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzID0gNjAgKiA1O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPaWRjQ2xpZW50U2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgLy8gbWV0YWRhdGEgcmVsYXRlZFxuICAgICAgICBhdXRob3JpdHksIG1ldGFkYXRhVXJsLCBtZXRhZGF0YSwgc2lnbmluZ0tleXMsXG4gICAgICAgIC8vIGNsaWVudCByZWxhdGVkXG4gICAgICAgIGNsaWVudF9pZCwgcmVzcG9uc2VfdHlwZSA9IERlZmF1bHRSZXNwb25zZVR5cGUsIHNjb3BlID0gRGVmYXVsdFNjb3BlLFxuICAgICAgICByZWRpcmVjdF91cmksIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSxcbiAgICAgICAgLy8gb3B0aW9uYWwgcHJvdG9jb2xcbiAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBhY3JfdmFsdWVzLFxuICAgICAgICAvLyBiZWhhdmlvciBmbGFnc1xuICAgICAgICBmaWx0ZXJQcm90b2NvbENsYWltcyA9IHRydWUsIGxvYWRVc2VySW5mbyA9IHRydWUsXG4gICAgICAgIHN0YWxlU3RhdGVBZ2UgPSBEZWZhdWx0U3RhbGVTdGF0ZUFnZSwgY2xvY2tTa2V3ID0gRGVmYXVsdENsb2NrU2tld0luU2Vjb25kcyxcbiAgICAgICAgLy8gb3RoZXIgYmVoYXZpb3JcbiAgICAgICAgc3RhdGVTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSgpLFxuICAgICAgICBSZXNwb25zZVZhbGlkYXRvckN0b3IgPSBSZXNwb25zZVZhbGlkYXRvcixcbiAgICAgICAgTWV0YWRhdGFTZXJ2aWNlQ3RvciA9IE1ldGFkYXRhU2VydmljZVxuICAgIH0gPSB7fSkge1xuXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybDtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSBzaWduaW5nS2V5cztcblxuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlX3R5cGUgPSByZXNwb25zZV90eXBlO1xuICAgICAgICB0aGlzLl9zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLl9yZWRpcmVjdF91cmkgPSByZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSA9IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcblxuICAgICAgICB0aGlzLl9wcm9tcHQgPSBwcm9tcHQ7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXkgPSBkaXNwbGF5O1xuICAgICAgICB0aGlzLl9tYXhfYWdlID0gbWF4X2FnZTtcbiAgICAgICAgdGhpcy5fdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXM7XG4gICAgICAgIHRoaXMuX2Fjcl92YWx1ZXMgPSBhY3JfdmFsdWVzO1xuXG4gICAgICAgIHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zID0gISFmaWx0ZXJQcm90b2NvbENsYWltcztcbiAgICAgICAgdGhpcy5fbG9hZFVzZXJJbmZvID0gISFsb2FkVXNlckluZm87XG4gICAgICAgIHRoaXMuX3N0YWxlU3RhdGVBZ2UgPSBzdGFsZVN0YXRlQWdlO1xuICAgICAgICB0aGlzLl9jbG9ja1NrZXcgPSBjbG9ja1NrZXc7XG5cbiAgICAgICAgdGhpcy5fc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmU7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IG5ldyBSZXNwb25zZVZhbGlkYXRvckN0b3IodGhpcyk7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIGNsaWVudCBjb25maWdcbiAgICBnZXQgY2xpZW50X2lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xuICAgIH1cbiAgICBzZXQgY2xpZW50X2lkKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2xpZW50X2lkKSB7XG4gICAgICAgICAgICAvLyBvbmUtdGltZSBzZXQgb25seVxuICAgICAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJjbGllbnRfaWQgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByZXNwb25zZV90eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VfdHlwZTtcbiAgICB9XG4gICAgZ2V0IHNjb3BlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2NvcGU7XG4gICAgfVxuICAgIGdldCByZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgIGdldCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk7XG4gICAgfVxuXG5cbiAgICAvLyBvcHRpb25hbCBwcm90b2NvbCBwYXJhbXNcbiAgICBnZXQgcHJvbXB0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbXB0O1xuICAgIH1cbiAgICBnZXQgZGlzcGxheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXk7XG4gICAgfVxuICAgIGdldCBtYXhfYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4X2FnZTtcbiAgICB9XG4gICAgZ2V0IHVpX2xvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91aV9sb2NhbGVzO1xuICAgIH1cbiAgICBnZXQgYWNyX3ZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fjcl92YWx1ZXM7XG4gICAgfVxuXG5cbiAgICAvLyBtZXRhZGF0YVxuICAgIGdldCBhdXRob3JpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRob3JpdHk7XG4gICAgfVxuICAgIHNldCBhdXRob3JpdHkodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XG4gICAgICAgICAgICB0aGlzLl9hdXRob3JpdHkgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImF1dGhvcml0eSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG1ldGFkYXRhVXJsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21ldGFkYXRhVXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IHRoaXMuYXV0aG9yaXR5O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmwgJiYgdGhpcy5fbWV0YWRhdGFVcmwuaW5kZXhPZihPaWRjTWV0YWRhdGFVcmxQYXRoKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWV0YWRhdGFVcmxbdGhpcy5fbWV0YWRhdGFVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCArPSAnLyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9IE9pZGNNZXRhZGF0YVVybFBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFVcmw7XG4gICAgfVxuXG4gICAgLy8gc2V0dGFibGUvY2FjaGFibGUgbWV0YWRhdGEgdmFsdWVzXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGE7XG4gICAgfVxuICAgIHNldCBtZXRhZGF0YSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBzaWduaW5nS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXlzO1xuICAgIH1cbiAgICBzZXQgc2lnbmluZ0tleXModmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2lnbmluZ0tleXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBmbGFnc1xuICAgIGdldCBmaWx0ZXJQcm90b2NvbENsYWltcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclByb3RvY29sQ2xhaW1zO1xuICAgIH1cbiAgICBnZXQgbG9hZFVzZXJJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFVzZXJJbmZvO1xuICAgIH1cbiAgICBnZXQgc3RhbGVTdGF0ZUFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWxlU3RhdGVBZ2U7XG4gICAgfVxuICAgIGdldCBjbG9ja1NrZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9ja1NrZXc7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXRlU3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZVN0b3JlO1xuICAgIH1cbiAgICBnZXQgdmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yO1xuICAgIH1cbiAgICBnZXQgbWV0YWRhdGFTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL09pZGNDbGllbnRTZXR0aW5ncy5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIHtcbiAgICBjb25zdHJ1Y3Rvcih7cHJlZml4ID0gXCJvaWRjLlwiLCBzdG9yZSA9IEdsb2JhbC5sb2NhbFN0b3JhZ2V9ID0ge30pIHtcbiAgICAgICAgdGhpcy5fc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgdGhpcy5fcHJlZml4ID0gcHJlZml4O1xuICAgIH1cblxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuc2V0XCIsIGtleSk7XG5cbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xuXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZ2V0KGtleSkge1xuICAgICAgICBMb2cuaW5mbyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldFwiLCBrZXkpO1xuXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcblxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaXRlbSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlKGtleSkge1xuICAgICAgICBMb2cuaW5mbyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLnJlbW92ZVwiLCBrZXkpO1xuXG4gICAgICAgIGtleSA9IHRoaXMuX3ByZWZpeCArIGtleTtcblxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX3N0b3JlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgdGhpcy5fc3RvcmUucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcbiAgICB9XG5cbiAgICBnZXRBbGxLZXlzKCkge1xuICAgICAgICBMb2cuaW5mbyhcIldlYlN0b3JhZ2VTdGF0ZVN0b3JlLmdldEFsbEtleXNcIik7XG5cbiAgICAgICAgdmFyIGtleXMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fc3RvcmUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5fc3RvcmUua2V5KGluZGV4KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKHRoaXMuX3ByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5LnN1YnN0cih0aGlzLl9wcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5cyk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvV2ViU3RvcmFnZVN0YXRlU3RvcmUuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5jb25zdCB0aW1lciA9IHtcbiAgICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAoY2IsIGR1cmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGNiLCBkdXJhdGlvbik7XG4gICAgfSxcbiAgICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIH1cbn07XG5cbmxldCB0ZXN0aW5nID0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsb2JhbCB7XG5cbiAgICBzdGF0aWMgX3Rlc3RpbmcoKSB7XG4gICAgICAgIHRlc3RpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgbG9jYXRpb24oKSB7XG4gICAgICAgIGlmICghdGVzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgbG9jYWxTdG9yYWdlKCkge1xuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldCBzZXNzaW9uU3RvcmFnZSgpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldCBYTUxIdHRwUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gWE1MSHR0cFJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldCB0aW1lcigpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvR2xvYmFsLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJy4vTWV0YWRhdGFTZXJ2aWNlJztcbmltcG9ydCBVc2VySW5mb1NlcnZpY2UgZnJvbSAnLi9Vc2VySW5mb1NlcnZpY2UnO1xuaW1wb3J0IEVycm9yUmVzcG9uc2UgZnJvbSAnLi9FcnJvclJlc3BvbnNlJztcbmltcG9ydCBKb3NlVXRpbCBmcm9tICcuL0pvc2VVdGlsJztcblxuY29uc3QgUHJvdG9jb2xDbGFpbXMgPSBbXCJub25jZVwiLCBcImF0X2hhc2hcIiwgXCJpYXRcIiwgXCJuYmZcIiwgXCJleHBcIiwgXCJhdWRcIiwgXCJpc3NcIiwgXCJjX2hhc2hcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc3BvbnNlVmFsaWRhdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlLCBVc2VySW5mb1NlcnZpY2VDdG9yID0gVXNlckluZm9TZXJ2aWNlLCBqb3NlVXRpbCA9IEpvc2VVdGlsKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBSZXNwb25zZVZhbGlkYXRvclwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl91c2VySW5mb1NlcnZpY2UgPSBuZXcgVXNlckluZm9TZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX2pvc2VVdGlsID0gam9zZVV0aWw7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTaWduaW5SZXNwb25zZShzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci52YWxpZGF0ZVNpZ25pblJlc3BvbnNlXCIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInN0YXRlIHByb2Nlc3NlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVRva2VucyhzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidG9rZW5zIHZhbGlkYXRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc0NsYWltcyhyZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiY2xhaW1zIHByb2Nlc3NlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlXCIpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5pZCAhPT0gcmVzcG9uc2Uuc3RhdGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRlIG1hdGNoZXMsIHRha2UgdGhlIHN0b3JlZCBkYXRhXG4gICAgICAgIC8vIGFuZCBzZXQgaXQgaW50byB0aGUgcmVzcG9uc2Ugc28gY2FsbGVycyBjYW4gZ2V0IHRoZWlyIHN0YXRlXG4gICAgICAgIC8vIHRoaXMgaXMgaW1wb3J0YW50IGZvciBib3RoIHN1Y2Nlc3MgJiBlcnJvciBvdXRjb21lc1xuICAgICAgICBMb2cuaW5mbyhcInN0YXRlIHZhbGlkYXRlZFwiKTtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdGUgPSBzdGF0ZS5kYXRhO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc1NpZ25pblBhcmFtcyhzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc1NpZ25pblBhcmFtc1wiKTtcblxuICAgICAgICBpZiAoc3RhdGUuaWQgIT09IHJlc3BvbnNlLnN0YXRlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGF0ZSBkb2VzIG5vdCBtYXRjaFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghc3RhdGUuY2xpZW50X2lkKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBjbGllbnRfaWQgb24gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gY2xpZW50X2lkIG9uIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFzdGF0ZS5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdXRob3JpdHkgb24gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGUgYXV0aG9yaXR5IHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBzaWduaW4gc3RhdGVcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSA9IHN0YXRlLmF1dGhvcml0eTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgYXV0aG9yaXR5IGlmIHRoZSBhdXRob3JpdHkgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgJiYgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ICE9PSBzdGF0ZS5hdXRob3JpdHkpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImF1dGhvcml0eSBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImF1dGhvcml0eSBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGUgY2xpZW50X2lkIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBzaWduaW4gc3RhdGVcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCA9IHN0YXRlLmNsaWVudF9pZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgd2UncmUgdXNpbmcgdGhlIGNvcnJlY3QgY2xpZW50X2lkIGlmIHRoZSBjbGllbnRfaWQgaXMgbm90IGxvYWRlZCBmcm9tIHNpZ25pbiBzdGF0ZVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgJiYgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkICE9PSBzdGF0ZS5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImNsaWVudF9pZCBtaXNtYXRjaCBvbiBzZXR0aW5ncyB2cy4gc2lnbmluIHN0YXRlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJvdGggc3VjY2VzcyAmIGVycm9yIG91dGNvbWVzXG4gICAgICAgIExvZy5pbmZvKFwic3RhdGUgdmFsaWRhdGVkXCIpO1xuICAgICAgICByZXNwb25zZS5zdGF0ZSA9IHN0YXRlLmRhdGE7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAmJiAhcmVzcG9uc2UuaWRfdG9rZW4pIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkV4cGVjdGluZyBpZF90b2tlbiBpbiByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRlLm5vbmNlICYmIHJlc3BvbnNlLmlkX3Rva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJOb3QgZXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgX3Byb2Nlc3NDbGFpbXMocmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fcHJvY2Vzc0NsYWltc1wiKTtcblxuICAgICAgICBpZiAocmVzcG9uc2UuaXNPcGVuSWRDb25uZWN0KSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlc3BvbnNlIGlzIE9JREMsIHByb2Nlc3NpbmcgY2xhaW1zXCIpO1xuXG4gICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMocmVzcG9uc2UucHJvZmlsZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5sb2FkVXNlckluZm8gJiYgcmVzcG9uc2UuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJsb2FkaW5nIHVzZXIgaW5mb1wiKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zKHJlc3BvbnNlLmFjY2Vzc190b2tlbikudGhlbihjbGFpbXMgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9tZXJnZUNsYWltcyhyZXNwb25zZS5wcm9maWxlLCBjbGFpbXMpO1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInVzZXIgaW5mbyBjbGFpbXMgcmVjZWl2ZWQsIHVwZGF0ZWQgcHJvZmlsZTpcIiwgcmVzcG9uc2UucHJvZmlsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJub3QgbG9hZGluZyB1c2VyIGluZm9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlc3BvbnNlIGlzIG5vdCBPSURDLCBub3QgcHJvY2Vzc2luZyBjbGFpbXNcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfbWVyZ2VDbGFpbXMoY2xhaW1zMSwgY2xhaW1zMikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zMSk7XG5cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjbGFpbXMyKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gY2xhaW1zMltuYW1lXTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtuYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtuYW1lXS5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbbmFtZV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IFtyZXN1bHRbbmFtZV0sIHZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF9maWx0ZXJQcm90b2NvbENsYWltcyhjbGFpbXMpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fZmlsdGVyUHJvdG9jb2xDbGFpbXMsIGluY29taW5nIGNsYWltczpcIiwgY2xhaW1zKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgY2xhaW1zKTtcblxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MuX2ZpbHRlclByb3RvY29sQ2xhaW1zKSB7XG4gICAgICAgICAgICBQcm90b2NvbENsYWltcy5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRbdHlwZV07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgTG9nLmluZm8oXCJwcm90b2NvbCBjbGFpbXMgZmlsdGVyZWRcIiwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwicHJvdG9jb2wgY2xhaW1zIG5vdCBmaWx0ZXJlZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVUb2tlbnMoc3RhdGUsIHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlVG9rZW5zXCIpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5pZF90b2tlbikge1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJWYWxpZGF0aW5nIGlkX3Rva2VuIGFuZCBhY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5pbmZvKFwiVmFsaWRhdGluZyBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIExvZy5pbmZvKFwiTm8gaWRfdG9rZW4gdG8gdmFsaWRhdGVcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlbihzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW5cIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbihzdGF0ZSwgcmVzcG9uc2UpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5cIik7XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5ub25jZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbm9uY2Ugb24gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gbm9uY2Ugb24gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgand0ID0gdGhpcy5fam9zZVV0aWwucGFyc2VKd3QocmVzcG9uc2UuaWRfdG9rZW4pO1xuICAgICAgICBpZiAoIWp3dCB8fCAhand0LmhlYWRlciB8fCAhand0LnBheWxvYWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUubm9uY2UgIT09IGp3dC5wYXlsb2FkLm5vbmNlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIG5vbmNlIGluIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGtpZCA9IGp3dC5oZWFkZXIua2lkO1xuICAgICAgICBpZiAoIWtpZCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGtpZCBmb3VuZCBpbiBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldElzc3VlcigpLnRoZW4oaXNzdWVyID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiUmVjZWl2ZWQgaXNzdWVyXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzKCkudGhlbihrZXlzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lnbmluZyBrZXlzIGZyb20gbWV0YWRhdGFcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBzaWduaW5nIGtleXNcIik7XG5cbiAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5raWQgPT09IGtpZDtcbiAgICAgICAgICAgICAgICB9KVswXTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGtleSBtYXRjaGluZyBraWQgZm91bmQgaW4gc2lnbmluZyBrZXlzXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBmb3VuZCBpbiBzaWduaW5nIGtleXNcIikpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdWRpZW5jZSA9IHN0YXRlLmNsaWVudF9pZDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgY2xvY2tTa2V3SW5TZWNvbmRzID0gdGhpcy5fc2V0dGluZ3MuY2xvY2tTa2V3O1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiVmFsaWRhaW5nIEpXVDsgdXNpbmcgY2xvY2sgc2tldyAoaW4gc2Vjb25kcykgb2Y6IFwiLCBjbG9ja1NrZXdJblNlY29uZHMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pvc2VVdGlsLnZhbGlkYXRlSnd0KHJlc3BvbnNlLmlkX3Rva2VuLCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tld0luU2Vjb25kcykudGhlbigoKT0+e1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIkpXVCB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wcm9maWxlID0gand0LnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlQWNjZXNzVG9rZW4ocmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVBY2Nlc3NUb2tlblwiKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLnByb2ZpbGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHByb2ZpbGUgbG9hZGVkIGZyb20gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gcHJvZmlsZSBsb2FkZWQgZnJvbSBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXRfaGFzaCBpbiBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzcG9uc2UuaWRfdG9rZW4pIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XG4gICAgICAgIGlmICghand0IHx8ICFqd3QuaGVhZGVyKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIiwgand0KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc2hBbGcgPSBqd3QuaGVhZGVyLmFsZztcbiAgICAgICAgaWYgKCFoYXNoQWxnIHx8IGhhc2hBbGcubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFzaEJpdHMgPSBoYXNoQWxnLnN1YnN0cigyLCAzKTtcbiAgICAgICAgaWYgKCFoYXNoQml0cykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhhc2hCaXRzID0gcGFyc2VJbnQoaGFzaEJpdHMpO1xuICAgICAgICBpZiAoaGFzaEJpdHMgIT09IDI1NiAmJiBoYXNoQml0cyAhPT0gMzg0ICYmIGhhc2hCaXRzICE9PSA1MTIpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZywgaGFzaEJpdHMpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFsZzogXCIgKyBoYXNoQWxnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2hhID0gXCJzaGFcIiArIGhhc2hCaXRzO1xuICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2pvc2VVdGlsLmhhc2hTdHJpbmcocmVzcG9uc2UuYWNjZXNzX3Rva2VuLCBzaGEpO1xuICAgICAgICBpZiAoIWhhc2gpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImFjY2Vzc190b2tlbiBoYXNoIGZhaWxlZDpcIiwgc2hhKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGVmdCA9IGhhc2guc3Vic3RyKDAsIGhhc2gubGVuZ3RoIC8gMik7XG4gICAgICAgIHZhciBsZWZ0X2I2NHUgPSB0aGlzLl9qb3NlVXRpbC5oZXhUb0Jhc2U2NFVybChsZWZ0KTtcbiAgICAgICAgaWYgKGxlZnRfYjY0dSAhPT0gcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiLCBsZWZ0X2I2NHUsIHJlc3BvbnNlLnByb2ZpbGUuYXRfaGFzaCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHZhbGlkYXRlIGF0X2hhc2hcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgSnNvblNlcnZpY2UgZnJvbSAnLi9Kc29uU2VydmljZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBNZXRhZGF0YVNlcnZpY2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcigpO1xuICAgIH1cblxuICAgIGdldE1ldGFkYXRhKCkge1xuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5nZXRNZXRhZGF0YVwiKTtcblxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiUmV0dXJuaW5nIG1ldGFkYXRhIGZyb20gc2V0dGluZ3NcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIG1ldGFkYXRhVXJsIGNvbmZpZ3VyZWQgb24gc2V0dGluZ3NcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBMb2cuaW5mbyhcImdldHRpbmcgbWV0YWRhdGEgZnJvbVwiLCB0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TZXJ2aWNlLmdldEpzb24odGhpcy5fc2V0dGluZ3MubWV0YWRhdGFVcmwpXG4gICAgICAgICAgICAudGhlbihtZXRhZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJqc29uIHJlY2VpdmVkXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIGdldElzc3VlcigpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImlzc3VlclwiKTtcbiAgICB9XG5cbiAgICBnZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldEF1dGhvcml6YXRpb25FbmRwb2ludFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJhdXRob3JpemF0aW9uX2VuZHBvaW50XCIpO1xuICAgIH1cblxuICAgIGdldFVzZXJJbmZvRW5kcG9pbnQoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFVzZXJJbmZvRW5kcG9pbnRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwidXNlcmluZm9fZW5kcG9pbnRcIik7XG4gICAgfVxuICAgIFxuICAgIGdldENoZWNrU2Vzc2lvbklmcmFtZSgpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImNoZWNrX3Nlc3Npb25faWZyYW1lXCIpO1xuICAgIH1cblxuICAgIGdldEVuZFNlc3Npb25FbmRwb2ludCgpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0RW5kU2Vzc2lvbkVuZHBvaW50XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImVuZF9zZXNzaW9uX2VuZHBvaW50XCIpO1xuICAgIH1cblxuICAgIF9nZXRNZXRhZGF0YVByb3BlcnR5KG5hbWUpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuX2dldE1ldGFkYXRhUHJvcGVydHlcIiwgbmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwibWV0YWRhdGEgcmVjaWV2ZWRcIik7XG5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTWV0YWRhdGEgZG9lcyBub3QgY29udGFpbiBwcm9wZXJ0eSBcIiArIG5hbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhW25hbWVdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRTaWduaW5nS2V5cygpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0U2lnbmluZ0tleXNcIik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzKSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIlJldHVybmluZyBzaWduaW5nS2V5cyBmcm9tIHNldHRpbmdzXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImp3a3NfdXJpXCIpLnRoZW4oandrc191cmkgPT4ge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJqd2tzX3VyaSByZWNlaXZlZFwiLCBqd2tzX3VyaSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKGp3a3NfdXJpKS50aGVuKGtleVNldCA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJrZXkgc2V0IHJlY2VpdmVkXCIsIGtleVNldCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleVNldC5rZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIk1pc3Npbmcga2V5cyBvbiBrZXlzZXRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcga2V5cyBvbiBrZXlzZXRcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlcmVkS2V5cyA9IHRoaXMuX2ZpbHRlclNpZ25pbmdLZXlzKGtleVNldC5rZXlzKTtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImZpbHRlcmVkIGtleXNcIiwgZmlsdGVyZWRLZXlzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzLnNpZ25pbmdLZXlzID0gZmlsdGVyZWRLZXlzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZmlsdGVyU2lnbmluZ0tleXMoa2V5cykge1xuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5fZmlsdGVyU2lnbmluZ0tleXNcIiwga2V5cyk7XG5cbiAgICAgICAgcmV0dXJuIGtleXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udXNlID09PSBcInNpZ1wiO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9NZXRhZGF0YVNlcnZpY2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi9HbG9iYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKc29uU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoWE1MSHR0cFJlcXVlc3RDdG9yID0gR2xvYmFsLlhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMuX1hNTEh0dHBSZXF1ZXN0ID0gWE1MSHR0cFJlcXVlc3RDdG9yO1xuICAgIH1cbiAgICBcbiAgICBnZXRKc29uKHVybCwgdG9rZW4pIHtcbiAgICAgICAgTG9nLmluZm8oXCJKc29uU2VydmljZS5nZXRKc29uXCIsIHVybCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXVybCl7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1cmwgcGFzc2VkXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXJsXCIpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVxID0gbmV3IHRoaXMuX1hNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcblxuICAgICAgICAgICAgcmVxLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiSFRUUCByZXNwb25zZSByZWNlaXZlZCwgc3RhdHVzXCIsIHJlcS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChyZXEuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKHJlcS5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCArIFwiIChcIiArIHJlcS5zdGF0dXMgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwibmV0d29yayBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidG9rZW4gcGFzc2VkLCBzZXR0aW5nIEF1dGhvcml6YXRpb24gaGVhZGVyXCIpO1xuICAgICAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIiArIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVxLnNlbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0pzb25TZXJ2aWNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IEpzb25TZXJ2aWNlIGZyb20gJy4vSnNvblNlcnZpY2UnO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckluZm9TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIFVzZXJJbmZvU2VydmljZVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5fanNvblNlcnZpY2UgPSBuZXcgSnNvblNlcnZpY2VDdG9yKCk7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhU2VydmljZSA9IG5ldyBNZXRhZGF0YVNlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG5cbiAgICBnZXRDbGFpbXModG9rZW4pIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VySW5mb1NlcnZpY2UuZ2V0Q2xhaW1zXCIpO1xuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHRva2VuIHBhc3NlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBIHRva2VuIGlzIHJlcXVpcmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0VXNlckluZm9FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwicmVjZWl2ZWQgdXNlcmluZm8gdXJsXCIsIHVybCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9qc29uU2VydmljZS5nZXRKc29uKHVybCwgdG9rZW4pLnRoZW4oY2xhaW1zID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImNsYWltcyByZWNlaXZlZFwiLCBjbGFpbXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXNlckluZm9TZXJ2aWNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVycm9yUmVzcG9uc2UgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3Ioe2Vycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiwgZXJyb3JfdXJpLCBzdGF0ZX09e31cbiAgICApIHtcbiAgICAgICAgIGlmICghZXJyb3Ipe1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gZXJyb3IgcGFzc2VkIHRvIEVycm9yUmVzcG9uc2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlcnJvclwiKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFcnJvclJlc3BvbnNlXCI7IFxuICAgICAgICBcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gZXJyb3JfZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gZXJyb3JfdXJpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0Vycm9yUmVzcG9uc2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgeyBqd3MsIEtFWVVUSUwgYXMgS2V5VXRpbCwgWDUwOSwgY3J5cHRvLCBoZXh0b2I2NHUgfSBmcm9tICdqc3JzYXNpZ24nO1xuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmNvbnN0IEFsbG93ZWRTaWduaW5nQWxncyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSm9zZVV0aWwge1xuXG4gICAgc3RhdGljIHBhcnNlSnd0KGp3dCkge1xuICAgICAgICBMb2cuaW5mbyhcIkpvc2VVdGlsLnBhcnNlSnd0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHRva2VuID0gandzLkpXUy5wYXJzZShqd3QpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRva2VuLmhlYWRlck9iaixcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB0b2tlbi5wYXlsb2FkT2JqXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3cpIHtcbiAgICAgICAgTG9nLmluZm8oXCJKb3NlVXRpbC52YWxpZGF0ZUp3dFwiKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGtleS5rdHkgPT09IFwiUlNBXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmUgJiYga2V5Lm4pIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5Lng1YyAmJiBrZXkueDVjLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNKGtleS54NWNbMF0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlJTQSBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleS5rdHkgPT09IFwiRUNcIikge1xuICAgICAgICAgICAgICAgIGlmIChrZXkuY3J2ICYmIGtleS54ICYmIGtleS55KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJFQyBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIiwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkVDIGtleSBtaXNzaW5nIGtleSBtYXRlcmlhbFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQga2V5IHR5cGVcIiwga2V5ICYmIGtleS5rdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBrZXkgdHlwZTogXCIgKyBrZXkgJiYga2V5Lmt0eSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gSm9zZVV0aWwuX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlICYmIGUubWVzc2FnZSB8fCBlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkpXVCB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBfdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KSB7XG4gICAgICAgIExvZy5pbmZvKFwiSm9zZVV0aWwuX3ZhbGlkYXRlSnd0XCIpO1xuXG4gICAgICAgIGlmICghY2xvY2tTa2V3KSB7XG4gICAgICAgICAgICBjbG9ja1NrZXcgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFub3cpIHtcbiAgICAgICAgICAgIG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXlsb2FkID0gSm9zZVV0aWwucGFyc2VKd3Qoand0KS5wYXlsb2FkO1xuXG4gICAgICAgIGlmIChwYXlsb2FkLmlzcyAhPT0gaXNzdWVyKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGlzc3VlciBpbiB0b2tlblwiLCBwYXlsb2FkLmlzcyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBpc3N1ZXIgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5pc3MpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXlsb2FkLmF1ZCAhPT0gYXVkaWVuY2UpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW5cIiwgcGF5bG9hZC5hdWQpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgYXVkaWVuY2UgaW4gdG9rZW46IFwiICsgcGF5bG9hZC5hdWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb3dlck5vdyA9IG5vdyArIGNsb2NrU2tldztcbiAgICAgICAgdmFyIHVwcGVyTm93ID0gbm93IC0gY2xvY2tTa2V3O1xuXG4gICAgICAgIGlmIChsb3dlck5vdyA8IHBheWxvYWQuaWF0KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJpYXQgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLmlhdCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaWF0IGlzIGluIHRoZSBmdXR1cmU6IFwiICsgcGF5bG9hZC5pYXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb3dlck5vdyA8IHBheWxvYWQubmJmKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJuYmYgaXMgaW4gdGhlIGZ1dHVyZVwiLCBwYXlsb2FkLm5iZik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwibmJmIGlzIGluIHRoZSBmdXR1cmU6IFwiICsgcGF5bG9hZC5uYmYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXlsb2FkLmV4cCA8IHVwcGVyTm93KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJleHAgaXMgaW4gdGhlIHBhc3RcIiwgcGF5bG9hZC5leHApO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImV4cCBpcyBpbiB0aGUgcGFzdDpcIiArIHBheWxvYWQuZXhwKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFqd3MuSldTLnZlcmlmeShqd3QsIGtleSwgQWxsb3dlZFNpZ25pbmdBbGdzKSkge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcInNpZ25hdHVyZSB2YWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwic2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKGUgJiYgZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInNpZ25hdHVyZSB2YWxpZGF0aW9uIGZhaWxlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGhhc2hTdHJpbmcodmFsdWUsIGFsZykge1xuICAgICAgICBMb2cuaW5mbyhcIkpvc2VVdGlsLmhhc2hTdHJpbmdcIiwgdmFsdWUsIGFsZyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh2YWx1ZSwgYWxnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGhleFRvQmFzZTY0VXJsKHZhbHVlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSm9zZVV0aWwuaGV4VG9CYXNlNjRVcmxcIiwgdmFsdWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGhleHRvYjY0dSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0pvc2VVdGlsLmpzXG4gKiovIiwiXG52YXIgbmF2aWdhdG9yID0ge307XG5uYXZpZ2F0b3IudXNlckFnZW50ID0gZmFsc2U7XG5cbnZhciB3aW5kb3cgPSB7fTtcbi8qXG4gKiBqc3JzYXNpZ24gNS4wLjEwIChjKSAyMDEwLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuXG4vKlxueWFob28tbWluLmpzXG5Db3B5cmlnaHQgKGMpIDIwMTEsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db2RlIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZTpcbmh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3l1aS9saWNlbnNlLmh0bWxcbnZlcnNpb246IDIuOS4wXG4qL1xuaWYodHlwZW9mIFlBSE9PPT1cInVuZGVmaW5lZFwifHwhWUFIT08pe3ZhciBZQUhPTz17fTt9WUFIT08ubmFtZXNwYWNlPWZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzLGc9bnVsbCxlLGMsZjtmb3IoZT0wO2U8Yi5sZW5ndGg7ZT1lKzEpe2Y9KFwiXCIrYltlXSkuc3BsaXQoXCIuXCIpO2c9WUFIT087Zm9yKGM9KGZbMF09PVwiWUFIT09cIik/MTowO2M8Zi5sZW5ndGg7Yz1jKzEpe2dbZltjXV09Z1tmW2NdXXx8e307Zz1nW2ZbY11dO319cmV0dXJuIGc7fTtZQUhPTy5sb2c9ZnVuY3Rpb24oZCxhLGMpe3ZhciBiPVlBSE9PLndpZGdldC5Mb2dnZXI7aWYoYiYmYi5sb2cpe3JldHVybiBiLmxvZyhkLGEsYyk7fWVsc2V7cmV0dXJuIGZhbHNlO319O1lBSE9PLnJlZ2lzdGVyPWZ1bmN0aW9uKGEsZixlKXt2YXIgaz1ZQUhPTy5lbnYubW9kdWxlcyxjLGosaCxnLGQ7aWYoIWtbYV0pe2tbYV09e3ZlcnNpb25zOltdLGJ1aWxkczpbXX07fWM9a1thXTtqPWUudmVyc2lvbjtoPWUuYnVpbGQ7Zz1ZQUhPTy5lbnYubGlzdGVuZXJzO2MubmFtZT1hO2MudmVyc2lvbj1qO2MuYnVpbGQ9aDtjLnZlcnNpb25zLnB1c2goaik7Yy5idWlsZHMucHVzaChoKTtjLm1haW5DbGFzcz1mO2ZvcihkPTA7ZDxnLmxlbmd0aDtkPWQrMSl7Z1tkXShjKTt9aWYoZil7Zi5WRVJTSU9OPWo7Zi5CVUlMRD1oO31lbHNle1lBSE9PLmxvZyhcIm1haW5DbGFzcyBpcyB1bmRlZmluZWQgZm9yIG1vZHVsZSBcIithLFwid2FyblwiKTt9fTtZQUhPTy5lbnY9WUFIT08uZW52fHx7bW9kdWxlczpbXSxsaXN0ZW5lcnM6W119O1lBSE9PLmVudi5nZXRWZXJzaW9uPWZ1bmN0aW9uKGEpe3JldHVybiBZQUhPTy5lbnYubW9kdWxlc1thXXx8bnVsbDt9O1lBSE9PLmVudi5wYXJzZVVBPWZ1bmN0aW9uKGQpe3ZhciBlPWZ1bmN0aW9uKGkpe3ZhciBqPTA7cmV0dXJuIHBhcnNlRmxvYXQoaS5yZXBsYWNlKC9cXC4vZyxmdW5jdGlvbigpe3JldHVybihqKys9PTEpP1wiXCI6XCIuXCI7fSkpO30saD1uYXZpZ2F0b3IsZz17aWU6MCxvcGVyYTowLGdlY2tvOjAsd2Via2l0OjAsY2hyb21lOjAsbW9iaWxlOm51bGwsYWlyOjAsaXBhZDowLGlwaG9uZTowLGlwb2Q6MCxpb3M6bnVsbCxhbmRyb2lkOjAsd2Vib3M6MCxjYWphOmgmJmguY2FqYVZlcnNpb24sc2VjdXJlOmZhbHNlLG9zOm51bGx9LGM9ZHx8KG5hdmlnYXRvciYmbmF2aWdhdG9yLnVzZXJBZ2VudCksZj13aW5kb3cmJndpbmRvdy5sb2NhdGlvbixiPWYmJmYuaHJlZixhO2cuc2VjdXJlPWImJihiLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImh0dHBzXCIpPT09MCk7aWYoYyl7aWYoKC93aW5kb3dzfHdpbjMyL2kpLnRlc3QoYykpe2cub3M9XCJ3aW5kb3dzXCI7fWVsc2V7aWYoKC9tYWNpbnRvc2gvaSkudGVzdChjKSl7Zy5vcz1cIm1hY2ludG9zaFwiO31lbHNle2lmKCgvcmhpbm8vaSkudGVzdChjKSl7Zy5vcz1cInJoaW5vXCI7fX19aWYoKC9LSFRNTC8pLnRlc3QoYykpe2cud2Via2l0PTE7fWE9Yy5tYXRjaCgvQXBwbGVXZWJLaXRcXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLndlYmtpdD1lKGFbMV0pO2lmKC8gTW9iaWxlXFwvLy50ZXN0KGMpKXtnLm1vYmlsZT1cIkFwcGxlXCI7YT1jLm1hdGNoKC9PUyAoW15cXHNdKikvKTtpZihhJiZhWzFdKXthPWUoYVsxXS5yZXBsYWNlKFwiX1wiLFwiLlwiKSk7fWcuaW9zPWE7Zy5pcGFkPWcuaXBvZD1nLmlwaG9uZT0wO2E9Yy5tYXRjaCgvaVBhZHxpUG9kfGlQaG9uZS8pO2lmKGEmJmFbMF0pe2dbYVswXS50b0xvd2VyQ2FzZSgpXT1nLmlvczt9fWVsc2V7YT1jLm1hdGNoKC9Ob2tpYU5bXlxcL10qfEFuZHJvaWQgXFxkXFwuXFxkfHdlYk9TXFwvXFxkXFwuXFxkLyk7aWYoYSl7Zy5tb2JpbGU9YVswXTt9aWYoL3dlYk9TLy50ZXN0KGMpKXtnLm1vYmlsZT1cIldlYk9TXCI7YT1jLm1hdGNoKC93ZWJPU1xcLyhbXlxcc10qKTsvKTtpZihhJiZhWzFdKXtnLndlYm9zPWUoYVsxXSk7fX1pZigvIEFuZHJvaWQvLnRlc3QoYykpe2cubW9iaWxlPVwiQW5kcm9pZFwiO2E9Yy5tYXRjaCgvQW5kcm9pZCAoW15cXHNdKik7Lyk7aWYoYSYmYVsxXSl7Zy5hbmRyb2lkPWUoYVsxXSk7fX19YT1jLm1hdGNoKC9DaHJvbWVcXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLmNocm9tZT1lKGFbMV0pO31lbHNle2E9Yy5tYXRjaCgvQWRvYmVBSVJcXC8oW15cXHNdKikvKTtpZihhKXtnLmFpcj1hWzBdO319fWlmKCFnLndlYmtpdCl7YT1jLm1hdGNoKC9PcGVyYVtcXHNcXC9dKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5vcGVyYT1lKGFbMV0pO2E9Yy5tYXRjaCgvVmVyc2lvblxcLyhbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cub3BlcmE9ZShhWzFdKTt9YT1jLm1hdGNoKC9PcGVyYSBNaW5pW147XSovKTtpZihhKXtnLm1vYmlsZT1hWzBdO319ZWxzZXthPWMubWF0Y2goL01TSUVcXHMoW147XSopLyk7aWYoYSYmYVsxXSl7Zy5pZT1lKGFbMV0pO31lbHNle2E9Yy5tYXRjaCgvR2Vja29cXC8oW15cXHNdKikvKTtpZihhKXtnLmdlY2tvPTE7YT1jLm1hdGNoKC9ydjooW15cXHNcXCldKikvKTtpZihhJiZhWzFdKXtnLmdlY2tvPWUoYVsxXSk7fX19fX19cmV0dXJuIGc7fTtZQUhPTy5lbnYudWE9WUFIT08uZW52LnBhcnNlVUEoKTsoZnVuY3Rpb24oKXtZQUhPTy5uYW1lc3BhY2UoXCJ1dGlsXCIsXCJ3aWRnZXRcIixcImV4YW1wbGVcIik7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBZQUhPT19jb25maWcpe3ZhciBiPVlBSE9PX2NvbmZpZy5saXN0ZW5lcixhPVlBSE9PLmVudi5saXN0ZW5lcnMsZD10cnVlLGM7aWYoYil7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl7aWYoYVtjXT09Yil7ZD1mYWxzZTticmVhazt9fWlmKGQpe2EucHVzaChiKTt9fX19KSgpO1lBSE9PLmxhbmc9WUFIT08ubGFuZ3x8e307KGZ1bmN0aW9uKCl7dmFyIGY9WUFIT08ubGFuZyxhPU9iamVjdC5wcm90b3R5cGUsYz1cIltvYmplY3QgQXJyYXldXCIsaD1cIltvYmplY3QgRnVuY3Rpb25dXCIsaT1cIltvYmplY3QgT2JqZWN0XVwiLGI9W10sZz17XCImXCI6XCImYW1wO1wiLFwiPFwiOlwiJmx0O1wiLFwiPlwiOlwiJmd0O1wiLCdcIic6XCImcXVvdDtcIixcIidcIjpcIiYjeDI3O1wiLFwiL1wiOlwiJiN4MkY7XCIsXCJgXCI6XCImI3g2MDtcIn0sZD1bXCJ0b1N0cmluZ1wiLFwidmFsdWVPZlwiXSxlPXtpc0FycmF5OmZ1bmN0aW9uKGope3JldHVybiBhLnRvU3RyaW5nLmFwcGx5KGopPT09Yzt9LGlzQm9vbGVhbjpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cImJvb2xlYW5cIjt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oail7cmV0dXJuKHR5cGVvZiBqPT09XCJmdW5jdGlvblwiKXx8YS50b1N0cmluZy5hcHBseShqKT09PWg7fSxpc051bGw6ZnVuY3Rpb24oail7cmV0dXJuIGo9PT1udWxsO30saXNOdW1iZXI6ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJudW1iZXJcIiYmaXNGaW5pdGUoaik7fSxpc09iamVjdDpmdW5jdGlvbihqKXtyZXR1cm4oaiYmKHR5cGVvZiBqPT09XCJvYmplY3RcInx8Zi5pc0Z1bmN0aW9uKGopKSl8fGZhbHNlO30saXNTdHJpbmc6ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJzdHJpbmdcIjt9LGlzVW5kZWZpbmVkOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwidW5kZWZpbmVkXCI7fSxfSUVFbnVtRml4OihZQUhPTy5lbnYudWEuaWUpP2Z1bmN0aW9uKGwsayl7dmFyIGosbixtO2ZvcihqPTA7ajxkLmxlbmd0aDtqPWorMSl7bj1kW2pdO209a1tuXTtpZihmLmlzRnVuY3Rpb24obSkmJm0hPWFbbl0pe2xbbl09bTt9fX06ZnVuY3Rpb24oKXt9LGVzY2FwZUhUTUw6ZnVuY3Rpb24oail7cmV0dXJuIGoucmVwbGFjZSgvWyY8PlwiJ1xcL2BdL2csZnVuY3Rpb24oayl7cmV0dXJuIGdba107fSk7fSxleHRlbmQ6ZnVuY3Rpb24obSxuLGwpe2lmKCFufHwhbSl7dGhyb3cgbmV3IEVycm9yKFwiZXh0ZW5kIGZhaWxlZCwgcGxlYXNlIGNoZWNrIHRoYXQgXCIrXCJhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC5cIik7fXZhciBrPWZ1bmN0aW9uKCl7fSxqO2sucHJvdG90eXBlPW4ucHJvdG90eXBlO20ucHJvdG90eXBlPW5ldyBrKCk7bS5wcm90b3R5cGUuY29uc3RydWN0b3I9bTttLnN1cGVyY2xhc3M9bi5wcm90b3R5cGU7aWYobi5wcm90b3R5cGUuY29uc3RydWN0b3I9PWEuY29uc3RydWN0b3Ipe24ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW47fWlmKGwpe2ZvcihqIGluIGwpe2lmKGYuaGFzT3duUHJvcGVydHkobCxqKSl7bS5wcm90b3R5cGVbal09bFtqXTt9fWYuX0lFRW51bUZpeChtLnByb3RvdHlwZSxsKTt9fSxhdWdtZW50T2JqZWN0OmZ1bmN0aW9uKG4sbSl7aWYoIW18fCFuKXt0aHJvdyBuZXcgRXJyb3IoXCJBYnNvcmIgZmFpbGVkLCB2ZXJpZnkgZGVwZW5kZW5jaWVzLlwiKTt9dmFyIGo9YXJndW1lbnRzLGwsbyxrPWpbMl07aWYoayYmayE9PXRydWUpe2ZvcihsPTI7bDxqLmxlbmd0aDtsPWwrMSl7bltqW2xdXT1tW2pbbF1dO319ZWxzZXtmb3IobyBpbiBtKXtpZihrfHwhKG8gaW4gbikpe25bb109bVtvXTt9fWYuX0lFRW51bUZpeChuLG0pO31yZXR1cm4gbjt9LGF1Z21lbnRQcm90bzpmdW5jdGlvbihtLGwpe2lmKCFsfHwhbSl7dGhyb3cgbmV3IEVycm9yKFwiQXVnbWVudCBmYWlsZWQsIHZlcmlmeSBkZXBlbmRlbmNpZXMuXCIpO312YXIgaj1bbS5wcm90b3R5cGUsbC5wcm90b3R5cGVdLGs7Zm9yKGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7az1rKzEpe2oucHVzaChhcmd1bWVudHNba10pO31mLmF1Z21lbnRPYmplY3QuYXBwbHkodGhpcyxqKTtyZXR1cm4gbTt9LGR1bXA6ZnVuY3Rpb24oaixwKXt2YXIgbCxuLHI9W10sdD1cInsuLi59XCIsaz1cImYoKXsuLi59XCIscT1cIiwgXCIsbT1cIiA9PiBcIjtpZighZi5pc09iamVjdChqKSl7cmV0dXJuIGorXCJcIjt9ZWxzZXtpZihqIGluc3RhbmNlb2YgRGF0ZXx8KFwibm9kZVR5cGVcIiBpbiBqJiZcInRhZ05hbWVcIiBpbiBqKSl7cmV0dXJuIGo7fWVsc2V7aWYoZi5pc0Z1bmN0aW9uKGopKXtyZXR1cm4gazt9fX1wPShmLmlzTnVtYmVyKHApKT9wOjM7aWYoZi5pc0FycmF5KGopKXtyLnB1c2goXCJbXCIpO2ZvcihsPTAsbj1qLmxlbmd0aDtsPG47bD1sKzEpe2lmKGYuaXNPYmplY3QoaltsXSkpe3IucHVzaCgocD4wKT9mLmR1bXAoaltsXSxwLTEpOnQpO31lbHNle3IucHVzaChqW2xdKTt9ci5wdXNoKHEpO31pZihyLmxlbmd0aD4xKXtyLnBvcCgpO31yLnB1c2goXCJdXCIpO31lbHNle3IucHVzaChcIntcIik7Zm9yKGwgaW4gail7aWYoZi5oYXNPd25Qcm9wZXJ0eShqLGwpKXtyLnB1c2gobCttKTtpZihmLmlzT2JqZWN0KGpbbF0pKXtyLnB1c2goKHA+MCk/Zi5kdW1wKGpbbF0scC0xKTp0KTt9ZWxzZXtyLnB1c2goaltsXSk7fXIucHVzaChxKTt9fWlmKHIubGVuZ3RoPjEpe3IucG9wKCk7fXIucHVzaChcIn1cIik7fXJldHVybiByLmpvaW4oXCJcIik7fSxzdWJzdGl0dXRlOmZ1bmN0aW9uKHgseSxFLGwpe3ZhciBELEMsQixHLHQsdSxGPVtdLHAsej14Lmxlbmd0aCxBPVwiZHVtcFwiLHI9XCIgXCIscT1cIntcIixtPVwifVwiLG4sdztmb3IoOzspe0Q9eC5sYXN0SW5kZXhPZihxLHopO2lmKEQ8MCl7YnJlYWs7fUM9eC5pbmRleE9mKG0sRCk7aWYoRCsxPkMpe2JyZWFrO31wPXguc3Vic3RyaW5nKEQrMSxDKTtHPXA7dT1udWxsO0I9Ry5pbmRleE9mKHIpO2lmKEI+LTEpe3U9Ry5zdWJzdHJpbmcoQisxKTtHPUcuc3Vic3RyaW5nKDAsQik7fXQ9eVtHXTtpZihFKXt0PUUoRyx0LHUpO31pZihmLmlzT2JqZWN0KHQpKXtpZihmLmlzQXJyYXkodCkpe3Q9Zi5kdW1wKHQscGFyc2VJbnQodSwxMCkpO31lbHNle3U9dXx8XCJcIjtuPXUuaW5kZXhPZihBKTtpZihuPi0xKXt1PXUuc3Vic3RyaW5nKDQpO313PXQudG9TdHJpbmcoKTtpZih3PT09aXx8bj4tMSl7dD1mLmR1bXAodCxwYXJzZUludCh1LDEwKSk7fWVsc2V7dD13O319fWVsc2V7aWYoIWYuaXNTdHJpbmcodCkmJiFmLmlzTnVtYmVyKHQpKXt0PVwifi1cIitGLmxlbmd0aCtcIi1+XCI7RltGLmxlbmd0aF09cDt9fXg9eC5zdWJzdHJpbmcoMCxEKSt0K3guc3Vic3RyaW5nKEMrMSk7aWYobD09PWZhbHNlKXt6PUQtMTt9fWZvcihEPUYubGVuZ3RoLTE7RD49MDtEPUQtMSl7eD14LnJlcGxhY2UobmV3IFJlZ0V4cChcIn4tXCIrRCtcIi1+XCIpLFwie1wiK0ZbRF0rXCJ9XCIsXCJnXCIpO31yZXR1cm4geDt9LHRyaW06ZnVuY3Rpb24oail7dHJ5e3JldHVybiBqLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7fWNhdGNoKGspe3JldHVybiBqO1xufX0sbWVyZ2U6ZnVuY3Rpb24oKXt2YXIgbj17fSxrPWFyZ3VtZW50cyxqPWsubGVuZ3RoLG07Zm9yKG09MDttPGo7bT1tKzEpe2YuYXVnbWVudE9iamVjdChuLGtbbV0sdHJ1ZSk7fXJldHVybiBuO30sbGF0ZXI6ZnVuY3Rpb24odCxrLHUsbixwKXt0PXR8fDA7az1rfHx7fTt2YXIgbD11LHM9bixxLGo7aWYoZi5pc1N0cmluZyh1KSl7bD1rW3VdO31pZighbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIm1ldGhvZCB1bmRlZmluZWRcIik7fWlmKCFmLmlzVW5kZWZpbmVkKG4pJiYhZi5pc0FycmF5KHMpKXtzPVtuXTt9cT1mdW5jdGlvbigpe2wuYXBwbHkoayxzfHxiKTt9O2o9KHApP3NldEludGVydmFsKHEsdCk6c2V0VGltZW91dChxLHQpO3JldHVybntpbnRlcnZhbDpwLGNhbmNlbDpmdW5jdGlvbigpe2lmKHRoaXMuaW50ZXJ2YWwpe2NsZWFySW50ZXJ2YWwoaik7fWVsc2V7Y2xlYXJUaW1lb3V0KGopO319fTt9LGlzVmFsdWU6ZnVuY3Rpb24oail7cmV0dXJuKGYuaXNPYmplY3Qoail8fGYuaXNTdHJpbmcoail8fGYuaXNOdW1iZXIoail8fGYuaXNCb29sZWFuKGopKTt9fTtmLmhhc093blByb3BlcnR5PShhLmhhc093blByb3BlcnR5KT9mdW5jdGlvbihqLGspe3JldHVybiBqJiZqLmhhc093blByb3BlcnR5JiZqLmhhc093blByb3BlcnR5KGspO306ZnVuY3Rpb24oaixrKXtyZXR1cm4gIWYuaXNVbmRlZmluZWQoaltrXSkmJmouY29uc3RydWN0b3IucHJvdG90eXBlW2tdIT09altrXTt9O2UuYXVnbWVudE9iamVjdChmLGUsdHJ1ZSk7WUFIT08udXRpbC5MYW5nPWY7Zi5hdWdtZW50PWYuYXVnbWVudFByb3RvO1lBSE9PLmF1Z21lbnQ9Zi5hdWdtZW50UHJvdG87WUFIT08uZXh0ZW5kPWYuZXh0ZW5kO30pKCk7WUFIT08ucmVnaXN0ZXIoXCJ5YWhvb1wiLFlBSE9PLHt2ZXJzaW9uOlwiMi45LjBcIixidWlsZDpcIjI4MDBcIn0pO1xuXG4vKiEgQ3J5cHRvSlMgdjMuMS4yIGNvcmUtZml4LmpzXG4gKiBjb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbiAqIChjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuICogVEhJUyBJUyBGSVggb2YgJ2NvcmUuanMnIHRvIGZpeCBIbWFjIGlzc3VlLlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvaXNzdWVzL2RldGFpbD9pZD04NFxuICogaHR0cHM6Ly9jcnlwdG8tanMuZ29vZ2xlY29kZS5jb20vc3ZuLWhpc3RvcnkvcjY2Ny9icmFuY2hlcy8zLngvc3JjL2NvcmUuanNcbiAqL1xudmFyIENyeXB0b0pTPUNyeXB0b0pTfHwoZnVuY3Rpb24oZSxnKXt2YXIgYT17fTt2YXIgYj1hLmxpYj17fTt2YXIgaj1iLkJhc2U9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe31yZXR1cm57ZXh0ZW5kOmZ1bmN0aW9uKHApe24ucHJvdG90eXBlPXRoaXM7dmFyIG89bmV3IG4oKTtpZihwKXtvLm1peEluKHApfWlmKCFvLmhhc093blByb3BlcnR5KFwiaW5pdFwiKSl7by5pbml0PWZ1bmN0aW9uKCl7by4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fW8uaW5pdC5wcm90b3R5cGU9bztvLiRzdXBlcj10aGlzO3JldHVybiBvfSxjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgbz10aGlzLmV4dGVuZCgpO28uaW5pdC5hcHBseShvLGFyZ3VtZW50cyk7cmV0dXJuIG99LGluaXQ6ZnVuY3Rpb24oKXt9LG1peEluOmZ1bmN0aW9uKHApe2Zvcih2YXIgbyBpbiBwKXtpZihwLmhhc093blByb3BlcnR5KG8pKXt0aGlzW29dPXBbb119fWlmKHAuaGFzT3duUHJvcGVydHkoXCJ0b1N0cmluZ1wiKSl7dGhpcy50b1N0cmluZz1wLnRvU3RyaW5nfX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyl9fX0oKSk7dmFyIGw9Yi5Xb3JkQXJyYXk9ai5leHRlbmQoe2luaXQ6ZnVuY3Rpb24obyxuKXtvPXRoaXMud29yZHM9b3x8W107aWYobiE9Zyl7dGhpcy5zaWdCeXRlcz1ufWVsc2V7dGhpcy5zaWdCeXRlcz1vLmxlbmd0aCo0fX0sdG9TdHJpbmc6ZnVuY3Rpb24obil7cmV0dXJuKG58fGgpLnN0cmluZ2lmeSh0aGlzKX0sY29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBxPXRoaXMud29yZHM7dmFyIHA9dC53b3Jkczt2YXIgbj10aGlzLnNpZ0J5dGVzO3ZhciBzPXQuc2lnQnl0ZXM7dGhpcy5jbGFtcCgpO2lmKG4lNCl7Zm9yKHZhciByPTA7cjxzO3IrKyl7dmFyIG89KHBbcj4+PjJdPj4+KDI0LShyJTQpKjgpKSYyNTU7cVsobityKT4+PjJdfD1vPDwoMjQtKChuK3IpJTQpKjgpfX1lbHNle2Zvcih2YXIgcj0wO3I8cztyKz00KXtxWyhuK3IpPj4+Ml09cFtyPj4+Ml19fXRoaXMuc2lnQnl0ZXMrPXM7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy53b3Jkczt2YXIgbj10aGlzLnNpZ0J5dGVzO29bbj4+PjJdJj00Mjk0OTY3Mjk1PDwoMzItKG4lNCkqOCk7by5sZW5ndGg9ZS5jZWlsKG4vNCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIG49ai5jbG9uZS5jYWxsKHRoaXMpO24ud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKTtyZXR1cm4gbn0scmFuZG9tOmZ1bmN0aW9uKHApe3ZhciBvPVtdO2Zvcih2YXIgbj0wO248cDtuKz00KXtvLnB1c2goKGUucmFuZG9tKCkqNDI5NDk2NzI5Nil8MCl9cmV0dXJuIG5ldyBsLmluaXQobyxwKX19KTt2YXIgbT1hLmVuYz17fTt2YXIgaD1tLkhleD17c3RyaW5naWZ5OmZ1bmN0aW9uKHApe3ZhciByPXAud29yZHM7dmFyIG89cC5zaWdCeXRlczt2YXIgcT1bXTtmb3IodmFyIG49MDtuPG87bisrKXt2YXIgcz0ocltuPj4+Ml0+Pj4oMjQtKG4lNCkqOCkpJjI1NTtxLnB1c2goKHM+Pj40KS50b1N0cmluZygxNikpO3EucHVzaCgocyYxNSkudG9TdHJpbmcoMTYpKX1yZXR1cm4gcS5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihwKXt2YXIgbj1wLmxlbmd0aDt2YXIgcT1bXTtmb3IodmFyIG89MDtvPG47bys9Mil7cVtvPj4+M118PXBhcnNlSW50KHAuc3Vic3RyKG8sMiksMTYpPDwoMjQtKG8lOCkqNCl9cmV0dXJuIG5ldyBsLmluaXQocSxuLzIpfX07dmFyIGQ9bS5MYXRpbjE9e3N0cmluZ2lmeTpmdW5jdGlvbihxKXt2YXIgcj1xLndvcmRzO3ZhciBwPXEuc2lnQnl0ZXM7dmFyIG49W107Zm9yKHZhciBvPTA7bzxwO28rKyl7dmFyIHM9KHJbbz4+PjJdPj4+KDI0LShvJTQpKjgpKSYyNTU7bi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUocykpfXJldHVybiBuLmpvaW4oXCJcIil9LHBhcnNlOmZ1bmN0aW9uKHApe3ZhciBuPXAubGVuZ3RoO3ZhciBxPVtdO2Zvcih2YXIgbz0wO288bjtvKyspe3Fbbz4+PjJdfD0ocC5jaGFyQ29kZUF0KG8pJjI1NSk8PCgyNC0obyU0KSo4KX1yZXR1cm4gbmV3IGwuaW5pdChxLG4pfX07dmFyIGM9bS5VdGY4PXtzdHJpbmdpZnk6ZnVuY3Rpb24obil7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGQuc3RyaW5naWZ5KG4pKSl9Y2F0Y2gobyl7dGhyb3cgbmV3IEVycm9yKFwiTWFsZm9ybWVkIFVURi04IGRhdGFcIil9fSxwYXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gZC5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQobikpKX19O3ZhciBpPWIuQnVmZmVyZWRCbG9ja0FsZ29yaXRobT1qLmV4dGVuZCh7cmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhPW5ldyBsLmluaXQoKTt0aGlzLl9uRGF0YUJ5dGVzPTB9LF9hcHBlbmQ6ZnVuY3Rpb24obil7aWYodHlwZW9mIG49PVwic3RyaW5nXCIpe249Yy5wYXJzZShuKX10aGlzLl9kYXRhLmNvbmNhdChuKTt0aGlzLl9uRGF0YUJ5dGVzKz1uLnNpZ0J5dGVzfSxfcHJvY2VzczpmdW5jdGlvbih3KXt2YXIgcT10aGlzLl9kYXRhO3ZhciB4PXEud29yZHM7dmFyIG49cS5zaWdCeXRlczt2YXIgdD10aGlzLmJsb2NrU2l6ZTt2YXIgdj10KjQ7dmFyIHU9bi92O2lmKHcpe3U9ZS5jZWlsKHUpfWVsc2V7dT1lLm1heCgodXwwKS10aGlzLl9taW5CdWZmZXJTaXplLDApfXZhciBzPXUqdDt2YXIgcj1lLm1pbihzKjQsbik7aWYocyl7Zm9yKHZhciBwPTA7cDxzO3ArPXQpe3RoaXMuX2RvUHJvY2Vzc0Jsb2NrKHgscCl9dmFyIG89eC5zcGxpY2UoMCxzKTtxLnNpZ0J5dGVzLT1yfXJldHVybiBuZXcgbC5pbml0KG8scil9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIG49ai5jbG9uZS5jYWxsKHRoaXMpO24uX2RhdGE9dGhpcy5fZGF0YS5jbG9uZSgpO3JldHVybiBufSxfbWluQnVmZmVyU2l6ZTowfSk7dmFyIGY9Yi5IYXNoZXI9aS5leHRlbmQoe2NmZzpqLmV4dGVuZCgpLGluaXQ6ZnVuY3Rpb24obil7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKG4pO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtpLnJlc2V0LmNhbGwodGhpcyk7dGhpcy5fZG9SZXNldCgpfSx1cGRhdGU6ZnVuY3Rpb24obil7dGhpcy5fYXBwZW5kKG4pO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24obil7aWYobil7dGhpcy5fYXBwZW5kKG4pfXZhciBvPXRoaXMuX2RvRmluYWxpemUoKTtyZXR1cm4gb30sYmxvY2tTaXplOjUxMi8zMixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLG8pe3JldHVybiBuZXcgbi5pbml0KG8pLmZpbmFsaXplKHApfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAsbyl7cmV0dXJuIG5ldyBrLkhNQUMuaW5pdChuLG8pLmZpbmFsaXplKHApfX19KTt2YXIgaz1hLmFsZ289e307cmV0dXJuIGF9KE1hdGgpKTtcbi8qXG5DcnlwdG9KUyB2My4xLjIgeDY0LWNvcmUtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihnKXt2YXIgYT1DcnlwdG9KUyxmPWEubGliLGU9Zi5CYXNlLGg9Zi5Xb3JkQXJyYXksYT1hLng2ND17fTthLldvcmQ9ZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYixjKXt0aGlzLmhpZ2g9Yjt0aGlzLmxvdz1jfX0pO2EuV29yZEFycmF5PWUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGIsYyl7Yj10aGlzLndvcmRzPWJ8fFtdO3RoaXMuc2lnQnl0ZXM9YyE9Zz9jOjgqYi5sZW5ndGh9LHRvWDMyOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMud29yZHMsYz1iLmxlbmd0aCxhPVtdLGQ9MDtkPGM7ZCsrKXt2YXIgZT1iW2RdO2EucHVzaChlLmhpZ2gpO2EucHVzaChlLmxvdyl9cmV0dXJuIGguY3JlYXRlKGEsdGhpcy5zaWdCeXRlcyl9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWUuY2xvbmUuY2FsbCh0aGlzKSxjPWIud29yZHM9dGhpcy53b3Jkcy5zbGljZSgwKSxhPWMubGVuZ3RoLGQ9MDtkPGE7ZCsrKWNbZF09Y1tkXS5jbG9uZSgpO3JldHVybiBifX0pfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBjaXBoZXItY29yZS1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuQ3J5cHRvSlMubGliLkNpcGhlcnx8ZnVuY3Rpb24odSl7dmFyIGc9Q3J5cHRvSlMsZj1nLmxpYixrPWYuQmFzZSxsPWYuV29yZEFycmF5LHE9Zi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtLHI9Zy5lbmMuQmFzZTY0LHY9Zy5hbGdvLkV2cEtERixuPWYuQ2lwaGVyPXEuZXh0ZW5kKHtjZmc6ay5leHRlbmQoKSxjcmVhdGVFbmNyeXB0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fRU5DX1hGT1JNX01PREUsYSxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0RFQ19YRk9STV9NT0RFLGEsYil9LGluaXQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChjKTt0aGlzLl94Zm9ybU1vZGU9YTt0aGlzLl9rZXk9Yjt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7cS5yZXNldC5jYWxsKHRoaXMpO3RoaXMuX2RvUmVzZXQoKX0scHJvY2VzczpmdW5jdGlvbihhKXt0aGlzLl9hcHBlbmQoYSk7XG5yZXR1cm4gdGhpcy5fcHJvY2VzcygpfSxmaW5hbGl6ZTpmdW5jdGlvbihhKXthJiZ0aGlzLl9hcHBlbmQoYSk7cmV0dXJuIHRoaXMuX2RvRmluYWxpemUoKX0sa2V5U2l6ZTo0LGl2U2l6ZTo0LF9FTkNfWEZPUk1fTU9ERToxLF9ERUNfWEZPUk1fTU9ERToyLF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYSl7cmV0dXJue2VuY3J5cHQ6ZnVuY3Rpb24oYixjLGQpe3JldHVybihcInN0cmluZ1wiPT10eXBlb2YgYz9zOmopLmVuY3J5cHQoYSxiLGMsZCl9LGRlY3J5cHQ6ZnVuY3Rpb24oYixjLGQpe3JldHVybihcInN0cmluZ1wiPT10eXBlb2YgYz9zOmopLmRlY3J5cHQoYSxiLGMsZCl9fX19KTtmLlN0cmVhbUNpcGhlcj1uLmV4dGVuZCh7X2RvRmluYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvY2VzcyghMCl9LGJsb2NrU2l6ZToxfSk7dmFyIG09Zy5tb2RlPXt9LHQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuX2l2O2Q/dGhpcy5faXY9dTpkPXRoaXMuX3ByZXZCbG9jaztmb3IodmFyIGU9XG4wO2U8YztlKyspYVtiK2VdXj1kW2VdfSxoPShmLkJsb2NrQ2lwaGVyTW9kZT1rLmV4dGVuZCh7Y3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShhLGIpfSxjcmVhdGVEZWNyeXB0b3I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5EZWNyeXB0b3IuY3JlYXRlKGEsYil9LGluaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLl9jaXBoZXI9YTt0aGlzLl9pdj1ifX0pKS5leHRlbmQoKTtoLkVuY3J5cHRvcj1oLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2lwaGVyLGQ9Yy5ibG9ja1NpemU7dC5jYWxsKHRoaXMsYSxiLGQpO2MuZW5jcnlwdEJsb2NrKGEsYik7dGhpcy5fcHJldkJsb2NrPWEuc2xpY2UoYixiK2QpfX0pO2guRGVjcnlwdG9yPWguZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9jaXBoZXIsZD1jLmJsb2NrU2l6ZSxlPWEuc2xpY2UoYixiK2QpO2MuZGVjcnlwdEJsb2NrKGEsXG5iKTt0LmNhbGwodGhpcyxhLGIsZCk7dGhpcy5fcHJldkJsb2NrPWV9fSk7bT1tLkNCQz1oO2g9KGcucGFkPXt9KS5Qa2NzNz17cGFkOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTQqYixjPWMtYS5zaWdCeXRlcyVjLGQ9Yzw8MjR8Yzw8MTZ8Yzw8OHxjLGU9W10sZj0wO2Y8YztmKz00KWUucHVzaChkKTtjPWwuY3JlYXRlKGUsYyk7YS5jb25jYXQoYyl9LHVucGFkOmZ1bmN0aW9uKGEpe2Euc2lnQnl0ZXMtPWEud29yZHNbYS5zaWdCeXRlcy0xPj4+Ml0mMjU1fX07Zi5CbG9ja0NpcGhlcj1uLmV4dGVuZCh7Y2ZnOm4uY2ZnLmV4dGVuZCh7bW9kZTptLHBhZGRpbmc6aH0pLHJlc2V0OmZ1bmN0aW9uKCl7bi5yZXNldC5jYWxsKHRoaXMpO3ZhciBhPXRoaXMuY2ZnLGI9YS5pdixhPWEubW9kZTtpZih0aGlzLl94Zm9ybU1vZGU9PXRoaXMuX0VOQ19YRk9STV9NT0RFKXZhciBjPWEuY3JlYXRlRW5jcnlwdG9yO2Vsc2UgYz1hLmNyZWF0ZURlY3J5cHRvcix0aGlzLl9taW5CdWZmZXJTaXplPTE7XG50aGlzLl9tb2RlPWMuY2FsbChhLHRoaXMsYiYmYi53b3Jkcyl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3RoaXMuX21vZGUucHJvY2Vzc0Jsb2NrKGEsYil9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jZmcucGFkZGluZztpZih0aGlzLl94Zm9ybU1vZGU9PXRoaXMuX0VOQ19YRk9STV9NT0RFKXthLnBhZCh0aGlzLl9kYXRhLHRoaXMuYmxvY2tTaXplKTt2YXIgYj10aGlzLl9wcm9jZXNzKCEwKX1lbHNlIGI9dGhpcy5fcHJvY2VzcyghMCksYS51bnBhZChiKTtyZXR1cm4gYn0sYmxvY2tTaXplOjR9KTt2YXIgcD1mLkNpcGhlclBhcmFtcz1rLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihhKXt0aGlzLm1peEluKGEpfSx0b1N0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4oYXx8dGhpcy5mb3JtYXR0ZXIpLnN0cmluZ2lmeSh0aGlzKX19KSxtPShnLmZvcm1hdD17fSkuT3BlblNTTD17c3RyaW5naWZ5OmZ1bmN0aW9uKGEpe3ZhciBiPWEuY2lwaGVydGV4dDthPWEuc2FsdDtcbnJldHVybihhP2wuY3JlYXRlKFsxMzk4ODkzNjg0LDE3MDEwNzY4MzFdKS5jb25jYXQoYSkuY29uY2F0KGIpOmIpLnRvU3RyaW5nKHIpfSxwYXJzZTpmdW5jdGlvbihhKXthPXIucGFyc2UoYSk7dmFyIGI9YS53b3JkcztpZigxMzk4ODkzNjg0PT1iWzBdJiYxNzAxMDc2ODMxPT1iWzFdKXt2YXIgYz1sLmNyZWF0ZShiLnNsaWNlKDIsNCkpO2Iuc3BsaWNlKDAsNCk7YS5zaWdCeXRlcy09MTZ9cmV0dXJuIHAuY3JlYXRlKHtjaXBoZXJ0ZXh0OmEsc2FsdDpjfSl9fSxqPWYuU2VyaWFsaXphYmxlQ2lwaGVyPWsuZXh0ZW5kKHtjZmc6ay5leHRlbmQoe2Zvcm1hdDptfSksZW5jcnlwdDpmdW5jdGlvbihhLGIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTt2YXIgZT1hLmNyZWF0ZUVuY3J5cHRvcihjLGQpO2I9ZS5maW5hbGl6ZShiKTtlPWUuY2ZnO3JldHVybiBwLmNyZWF0ZSh7Y2lwaGVydGV4dDpiLGtleTpjLGl2OmUuaXYsYWxnb3JpdGhtOmEsbW9kZTplLm1vZGUscGFkZGluZzplLnBhZGRpbmcsXG5ibG9ja1NpemU6YS5ibG9ja1NpemUsZm9ybWF0dGVyOmQuZm9ybWF0fSl9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yj10aGlzLl9wYXJzZShiLGQuZm9ybWF0KTtyZXR1cm4gYS5jcmVhdGVEZWNyeXB0b3IoYyxkKS5maW5hbGl6ZShiLmNpcGhlcnRleHQpfSxfcGFyc2U6ZnVuY3Rpb24oYSxiKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYT9iLnBhcnNlKGEsdGhpcyk6YX19KSxnPShnLmtkZj17fSkuT3BlblNTTD17ZXhlY3V0ZTpmdW5jdGlvbihhLGIsYyxkKXtkfHwoZD1sLnJhbmRvbSg4KSk7YT12LmNyZWF0ZSh7a2V5U2l6ZTpiK2N9KS5jb21wdXRlKGEsZCk7Yz1sLmNyZWF0ZShhLndvcmRzLnNsaWNlKGIpLDQqYyk7YS5zaWdCeXRlcz00KmI7cmV0dXJuIHAuY3JlYXRlKHtrZXk6YSxpdjpjLHNhbHQ6ZH0pfX0scz1mLlBhc3N3b3JkQmFzZWRDaXBoZXI9ai5leHRlbmQoe2NmZzpqLmNmZy5leHRlbmQoe2tkZjpnfSksZW5jcnlwdDpmdW5jdGlvbihhLFxuYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2M9ZC5rZGYuZXhlY3V0ZShjLGEua2V5U2l6ZSxhLml2U2l6ZSk7ZC5pdj1jLml2O2E9ai5lbmNyeXB0LmNhbGwodGhpcyxhLGIsYy5rZXksZCk7YS5taXhJbihjKTtyZXR1cm4gYX0sZGVjcnlwdDpmdW5jdGlvbihhLGIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtiPXRoaXMuX3BhcnNlKGIsZC5mb3JtYXQpO2M9ZC5rZGYuZXhlY3V0ZShjLGEua2V5U2l6ZSxhLml2U2l6ZSxiLnNhbHQpO2QuaXY9Yy5pdjtyZXR1cm4gai5kZWNyeXB0LmNhbGwodGhpcyxhLGIsYy5rZXksZCl9fSl9KCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgYWVzLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmb3IodmFyIHE9Q3J5cHRvSlMseD1xLmxpYi5CbG9ja0NpcGhlcixyPXEuYWxnbyxqPVtdLHk9W10sej1bXSxBPVtdLEI9W10sQz1bXSxzPVtdLHU9W10sdj1bXSx3PVtdLGc9W10saz0wOzI1Nj5rO2srKylnW2tdPTEyOD5rP2s8PDE6azw8MV4yODM7Zm9yKHZhciBuPTAsbD0wLGs9MDsyNTY+aztrKyspe3ZhciBmPWxebDw8MV5sPDwyXmw8PDNebDw8NCxmPWY+Pj44XmYmMjU1Xjk5O2pbbl09Zjt5W2ZdPW47dmFyIHQ9Z1tuXSxEPWdbdF0sRT1nW0RdLGI9MjU3KmdbZl1eMTY4NDMwMDgqZjt6W25dPWI8PDI0fGI+Pj44O0Fbbl09Yjw8MTZ8Yj4+PjE2O0Jbbl09Yjw8OHxiPj4+MjQ7Q1tuXT1iO2I9MTY4NDMwMDkqRV42NTUzNypEXjI1Nyp0XjE2ODQzMDA4Km47c1tmXT1iPDwyNHxiPj4+ODt1W2ZdPWI8PDE2fGI+Pj4xNjt2W2ZdPWI8PDh8Yj4+PjI0O3dbZl09YjtuPyhuPXReZ1tnW2dbRV50XV1dLGxePWdbZ1tsXV0pOm49bD0xfXZhciBGPVswLDEsMiw0LDgsXG4xNiwzMiw2NCwxMjgsMjcsNTRdLHI9ci5BRVM9eC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBjPXRoaXMuX2tleSxlPWMud29yZHMsYT1jLnNpZ0J5dGVzLzQsYz00KigodGhpcy5fblJvdW5kcz1hKzYpKzEpLGI9dGhpcy5fa2V5U2NoZWR1bGU9W10saD0wO2g8YztoKyspaWYoaDxhKWJbaF09ZVtoXTtlbHNle3ZhciBkPWJbaC0xXTtoJWE/NjxhJiY0PT1oJWEmJihkPWpbZD4+PjI0XTw8MjR8altkPj4+MTYmMjU1XTw8MTZ8altkPj4+OCYyNTVdPDw4fGpbZCYyNTVdKTooZD1kPDw4fGQ+Pj4yNCxkPWpbZD4+PjI0XTw8MjR8altkPj4+MTYmMjU1XTw8MTZ8altkPj4+OCYyNTVdPDw4fGpbZCYyNTVdLGRePUZbaC9hfDBdPDwyNCk7YltoXT1iW2gtYV1eZH1lPXRoaXMuX2ludktleVNjaGVkdWxlPVtdO2ZvcihhPTA7YTxjO2ErKyloPWMtYSxkPWElND9iW2hdOmJbaC00XSxlW2FdPTQ+YXx8ND49aD9kOnNbaltkPj4+MjRdXV51W2pbZD4+PjE2JjI1NV1dXnZbaltkPj4+XG44JjI1NV1dXndbaltkJjI1NV1dfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlKXt0aGlzLl9kb0NyeXB0QmxvY2soYyxlLHRoaXMuX2tleVNjaGVkdWxlLHosQSxCLEMsail9LGRlY3J5cHRCbG9jazpmdW5jdGlvbihjLGUpe3ZhciBhPWNbZSsxXTtjW2UrMV09Y1tlKzNdO2NbZSszXT1hO3RoaXMuX2RvQ3J5cHRCbG9jayhjLGUsdGhpcy5faW52S2V5U2NoZWR1bGUscyx1LHYsdyx5KTthPWNbZSsxXTtjW2UrMV09Y1tlKzNdO2NbZSszXT1hfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSxhLGIsaCxkLGosbSl7Zm9yKHZhciBuPXRoaXMuX25Sb3VuZHMsZj1jW2VdXmFbMF0sZz1jW2UrMV1eYVsxXSxrPWNbZSsyXV5hWzJdLHA9Y1tlKzNdXmFbM10sbD00LHQ9MTt0PG47dCsrKXZhciBxPWJbZj4+PjI0XV5oW2c+Pj4xNiYyNTVdXmRbaz4+PjgmMjU1XV5qW3AmMjU1XV5hW2wrK10scj1iW2c+Pj4yNF1eaFtrPj4+MTYmMjU1XV5kW3A+Pj44JjI1NV1ealtmJjI1NV1eYVtsKytdLHM9XG5iW2s+Pj4yNF1eaFtwPj4+MTYmMjU1XV5kW2Y+Pj44JjI1NV1ealtnJjI1NV1eYVtsKytdLHA9YltwPj4+MjRdXmhbZj4+PjE2JjI1NV1eZFtnPj4+OCYyNTVdXmpbayYyNTVdXmFbbCsrXSxmPXEsZz1yLGs9cztxPShtW2Y+Pj4yNF08PDI0fG1bZz4+PjE2JjI1NV08PDE2fG1baz4+PjgmMjU1XTw8OHxtW3AmMjU1XSleYVtsKytdO3I9KG1bZz4+PjI0XTw8MjR8bVtrPj4+MTYmMjU1XTw8MTZ8bVtwPj4+OCYyNTVdPDw4fG1bZiYyNTVdKV5hW2wrK107cz0obVtrPj4+MjRdPDwyNHxtW3A+Pj4xNiYyNTVdPDwxNnxtW2Y+Pj44JjI1NV08PDh8bVtnJjI1NV0pXmFbbCsrXTtwPShtW3A+Pj4yNF08PDI0fG1bZj4+PjE2JjI1NV08PDE2fG1bZz4+PjgmMjU1XTw8OHxtW2smMjU1XSleYVtsKytdO2NbZV09cTtjW2UrMV09cjtjW2UrMl09cztjW2UrM109cH0sa2V5U2l6ZTo4fSk7cS5BRVM9eC5fY3JlYXRlSGVscGVyKHIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiB0cmlwbGVkZXMtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe2Z1bmN0aW9uIGooYixjKXt2YXIgYT0odGhpcy5fbEJsb2NrPj4+Yl50aGlzLl9yQmxvY2spJmM7dGhpcy5fckJsb2NrXj1hO3RoaXMuX2xCbG9ja149YTw8Yn1mdW5jdGlvbiBsKGIsYyl7dmFyIGE9KHRoaXMuX3JCbG9jaz4+PmJedGhpcy5fbEJsb2NrKSZjO3RoaXMuX2xCbG9ja149YTt0aGlzLl9yQmxvY2tePWE8PGJ9dmFyIGg9Q3J5cHRvSlMsZT1oLmxpYixuPWUuV29yZEFycmF5LGU9ZS5CbG9ja0NpcGhlcixnPWguYWxnbyxxPVs1Nyw0OSw0MSwzMywyNSwxNyw5LDEsNTgsNTAsNDIsMzQsMjYsMTgsMTAsMiw1OSw1MSw0MywzNSwyNywxOSwxMSwzLDYwLDUyLDQ0LDM2LDYzLDU1LDQ3LDM5LDMxLDIzLDE1LDcsNjIsNTQsNDYsMzgsMzAsMjIsMTQsNiw2MSw1Myw0NSwzNywyOSwyMSwxMyw1LDI4LDIwLDEyLDRdLHA9WzE0LDE3LDExLDI0LDEsNSwzLDI4LDE1LDYsMjEsMTAsMjMsMTksMTIsNCwyNiw4LDE2LDcsMjcsMjAsMTMsMiw0MSw1MiwzMSwzNyw0NyxcbjU1LDMwLDQwLDUxLDQ1LDMzLDQ4LDQ0LDQ5LDM5LDU2LDM0LDUzLDQ2LDQyLDUwLDM2LDI5LDMyXSxyPVsxLDIsNCw2LDgsMTAsMTIsMTQsMTUsMTcsMTksMjEsMjMsMjUsMjcsMjhdLHM9W3tcIjBcIjo4NDIxODg4LDI2ODQzNTQ1NjozMjc2OCw1MzY4NzA5MTI6ODQyMTM3OCw4MDUzMDYzNjg6MiwxMDczNzQxODI0OjUxMiwxMzQyMTc3MjgwOjg0MjE4OTAsMTYxMDYxMjczNjo4Mzg5MTIyLDE4NzkwNDgxOTI6ODM4ODYwOCwyMTQ3NDgzNjQ4OjUxNCwyNDE1OTE5MTA0OjgzODkxMjAsMjY4NDM1NDU2MDozMzI4MCwyOTUyNzkwMDE2Ojg0MjEzNzYsMzIyMTIyNTQ3MjozMjc3MCwzNDg5NjYwOTI4OjgzODg2MTAsMzc1ODA5NjM4NDowLDQwMjY1MzE4NDA6MzMyODIsMTM0MjE3NzI4OjAsNDAyNjUzMTg0Ojg0MjE4OTAsNjcxMDg4NjQwOjMzMjgyLDkzOTUyNDA5NjozMjc2OCwxMjA3OTU5NTUyOjg0MjE4ODgsMTQ3NjM5NTAwODo1MTIsMTc0NDgzMDQ2NDo4NDIxMzc4LDIwMTMyNjU5MjA6MixcbjIyODE3MDEzNzY6ODM4OTEyMCwyNTUwMTM2ODMyOjMzMjgwLDI4MTg1NzIyODg6ODQyMTM3NiwzMDg3MDA3NzQ0OjgzODkxMjIsMzM1NTQ0MzIwMDo4Mzg4NjEwLDM2MjM4Nzg2NTY6MzI3NzAsMzg5MjMxNDExMjo1MTQsNDE2MDc0OTU2ODo4Mzg4NjA4LDE6MzI3NjgsMjY4NDM1NDU3OjIsNTM2ODcwOTEzOjg0MjE4ODgsODA1MzA2MzY5OjgzODg2MDgsMTA3Mzc0MTgyNTo4NDIxMzc4LDEzNDIxNzcyODE6MzMyODAsMTYxMDYxMjczNzo1MTIsMTg3OTA0ODE5Mzo4Mzg5MTIyLDIxNDc0ODM2NDk6ODQyMTg5MCwyNDE1OTE5MTA1Ojg0MjEzNzYsMjY4NDM1NDU2MTo4Mzg4NjEwLDI5NTI3OTAwMTc6MzMyODIsMzIyMTIyNTQ3Mzo1MTQsMzQ4OTY2MDkyOTo4Mzg5MTIwLDM3NTgwOTYzODU6MzI3NzAsNDAyNjUzMTg0MTowLDEzNDIxNzcyOTo4NDIxODkwLDQwMjY1MzE4NTo4NDIxMzc2LDY3MTA4ODY0MTo4Mzg4NjA4LDkzOTUyNDA5Nzo1MTIsMTIwNzk1OTU1MzozMjc2OCwxNDc2Mzk1MDA5OjgzODg2MTAsXG4xNzQ0ODMwNDY1OjIsMjAxMzI2NTkyMTozMzI4MiwyMjgxNzAxMzc3OjMyNzcwLDI1NTAxMzY4MzM6ODM4OTEyMiwyODE4NTcyMjg5OjUxNCwzMDg3MDA3NzQ1Ojg0MjE4ODgsMzM1NTQ0MzIwMTo4Mzg5MTIwLDM2MjM4Nzg2NTc6MCwzODkyMzE0MTEzOjMzMjgwLDQxNjA3NDk1Njk6ODQyMTM3OH0se1wiMFwiOjEwNzQyODI1MTIsMTY3NzcyMTY6MTYzODQsMzM1NTQ0MzI6NTI0Mjg4LDUwMzMxNjQ4OjEwNzQyNjYxMjgsNjcxMDg4NjQ6MTA3Mzc0MTg0MCw4Mzg4NjA4MDoxMDc0MjgyNDk2LDEwMDY2MzI5NjoxMDczNzU4MjA4LDExNzQ0MDUxMjoxNiwxMzQyMTc3Mjg6NTQwNjcyLDE1MDk5NDk0NDoxMDczNzU4MjI0LDE2Nzc3MjE2MDoxMDczNzQxODI0LDE4NDU0OTM3Njo1NDA2ODgsMjAxMzI2NTkyOjUyNDMwNCwyMTgxMDM4MDg6MCwyMzQ4ODEwMjQ6MTY0MDAsMjUxNjU4MjQwOjEwNzQyNjYxMTIsODM4ODYwODoxMDczNzU4MjA4LDI1MTY1ODI0OjU0MDY4OCw0MTk0MzA0MDoxNiw1ODcyMDI1NjoxMDczNzU4MjI0LFxuNzU0OTc0NzI6MTA3NDI4MjUxMiw5MjI3NDY4ODoxMDczNzQxODI0LDEwOTA1MTkwNDo1MjQyODgsMTI1ODI5MTIwOjEwNzQyNjYxMjgsMTQyNjA2MzM2OjUyNDMwNCwxNTkzODM1NTI6MCwxNzYxNjA3Njg6MTYzODQsMTkyOTM3OTg0OjEwNzQyNjYxMTIsMjA5NzE1MjAwOjEwNzM3NDE4NDAsMjI2NDkyNDE2OjU0MDY3MiwyNDMyNjk2MzI6MTA3NDI4MjQ5NiwyNjAwNDY4NDg6MTY0MDAsMjY4NDM1NDU2OjAsMjg1MjEyNjcyOjEwNzQyNjYxMjgsMzAxOTg5ODg4OjEwNzM3NTgyMjQsMzE4NzY3MTA0OjEwNzQyODI0OTYsMzM1NTQ0MzIwOjEwNzQyNjYxMTIsMzUyMzIxNTM2OjE2LDM2OTA5ODc1Mjo1NDA2ODgsMzg1ODc1OTY4OjE2Mzg0LDQwMjY1MzE4NDoxNjQwMCw0MTk0MzA0MDA6NTI0Mjg4LDQzNjIwNzYxNjo1MjQzMDQsNDUyOTg0ODMyOjEwNzM3NDE4NDAsNDY5NzYyMDQ4OjU0MDY3Miw0ODY1MzkyNjQ6MTA3Mzc1ODIwOCw1MDMzMTY0ODA6MTA3Mzc0MTgyNCw1MjAwOTM2OTY6MTA3NDI4MjUxMixcbjI3NjgyNDA2NDo1NDA2ODgsMjkzNjAxMjgwOjUyNDI4OCwzMTAzNzg0OTY6MTA3NDI2NjExMiwzMjcxNTU3MTI6MTYzODQsMzQzOTMyOTI4OjEwNzM3NTgyMDgsMzYwNzEwMTQ0OjEwNzQyODI1MTIsMzc3NDg3MzYwOjE2LDM5NDI2NDU3NjoxMDczNzQxODI0LDQxMTA0MTc5MjoxMDc0MjgyNDk2LDQyNzgxOTAwODoxMDczNzQxODQwLDQ0NDU5NjIyNDoxMDczNzU4MjI0LDQ2MTM3MzQ0MDo1MjQzMDQsNDc4MTUwNjU2OjAsNDk0OTI3ODcyOjE2NDAwLDUxMTcwNTA4ODoxMDc0MjY2MTI4LDUyODQ4MjMwNDo1NDA2NzJ9LHtcIjBcIjoyNjAsMTA0ODU3NjowLDIwOTcxNTI6NjcxMDkxMjAsMzE0NTcyODo2NTc5Niw0MTk0MzA0OjY1NTQwLDUyNDI4ODA6NjcxMDg4NjgsNjI5MTQ1Njo2NzE3NDY2MCw3MzQwMDMyOjY3MTc0NDAwLDgzODg2MDg6NjcxMDg4NjQsOTQzNzE4NDo2NzE3NDY1NiwxMDQ4NTc2MDo2NTc5MiwxMTUzNDMzNjo2NzE3NDQwNCwxMjU4MjkxMjo2NzEwOTEyNCwxMzYzMTQ4ODo2NTUzNixcbjE0NjgwMDY0OjQsMTU3Mjg2NDA6MjU2LDUyNDI4ODo2NzE3NDY1NiwxNTcyODY0OjY3MTc0NDA0LDI2MjE0NDA6MCwzNjcwMDE2OjY3MTA5MTIwLDQ3MTg1OTI6NjcxMDg4NjgsNTc2NzE2ODo2NTUzNiw2ODE1NzQ0OjY1NTQwLDc4NjQzMjA6MjYwLDg5MTI4OTY6NCw5OTYxNDcyOjI1NiwxMTAxMDA0ODo2NzE3NDQwMCwxMjA1ODYyNDo2NTc5NiwxMzEwNzIwMDo2NTc5MiwxNDE1NTc3Njo2NzEwOTEyNCwxNTIwNDM1Mjo2NzE3NDY2MCwxNjI1MjkyODo2NzEwODg2NCwxNjc3NzIxNjo2NzE3NDY1NiwxNzgyNTc5Mjo2NTU0MCwxODg3NDM2ODo2NTUzNiwxOTkyMjk0NDo2NzEwOTEyMCwyMDk3MTUyMDoyNTYsMjIwMjAwOTY6NjcxNzQ2NjAsMjMwNjg2NzI6NjcxMDg4NjgsMjQxMTcyNDg6MCwyNTE2NTgyNDo2NzEwOTEyNCwyNjIxNDQwMDo2NzEwODg2NCwyNzI2Mjk3Njo0LDI4MzExNTUyOjY1NzkyLDI5MzYwMTI4OjY3MTc0NDAwLDMwNDA4NzA0OjI2MCwzMTQ1NzI4MDo2NTc5NiwzMjUwNTg1Njo2NzE3NDQwNCxcbjE3MzAxNTA0OjY3MTA4ODY0LDE4MzUwMDgwOjI2MCwxOTM5ODY1Njo2NzE3NDY1NiwyMDQ0NzIzMjowLDIxNDk1ODA4OjY1NTQwLDIyNTQ0Mzg0OjY3MTA5MTIwLDIzNTkyOTYwOjI1NiwyNDY0MTUzNjo2NzE3NDQwNCwyNTY5MDExMjo2NTUzNiwyNjczODY4ODo2NzE3NDY2MCwyNzc4NzI2NDo2NTc5NiwyODgzNTg0MDo2NzEwODg2OCwyOTg4NDQxNjo2NzEwOTEyNCwzMDkzMjk5Mjo2NzE3NDQwMCwzMTk4MTU2ODo0LDMzMDMwMTQ0OjY1NzkyfSx7XCIwXCI6MjE1MTY4MjA0OCw2NTUzNjoyMTQ3NDg3ODA4LDEzMTA3Mjo0MTk4NDY0LDE5NjYwODoyMTUxNjc3OTUyLDI2MjE0NDowLDMyNzY4MDo0MTk4NDAwLDM5MzIxNjoyMTQ3NDgzNzEyLDQ1ODc1Mjo0MTk0MzY4LDUyNDI4ODoyMTQ3NDgzNjQ4LDU4OTgyNDo0MTk0MzA0LDY1NTM2MDo2NCw3MjA4OTY6MjE0NzQ4Nzc0NCw3ODY0MzI6MjE1MTY3ODAxNiw4NTE5Njg6NDE2MCw5MTc1MDQ6NDA5Niw5ODMwNDA6MjE1MTY4MjExMiwzMjc2ODoyMTQ3NDg3ODA4LFxuOTgzMDQ6NjQsMTYzODQwOjIxNTE2NzgwMTYsMjI5Mzc2OjIxNDc0ODc3NDQsMjk0OTEyOjQxOTg0MDAsMzYwNDQ4OjIxNTE2ODIxMTIsNDI1OTg0OjAsNDkxNTIwOjIxNTE2Nzc5NTIsNTU3MDU2OjQwOTYsNjIyNTkyOjIxNTE2ODIwNDgsNjg4MTI4OjQxOTQzMDQsNzUzNjY0OjQxNjAsODE5MjAwOjIxNDc0ODM2NDgsODg0NzM2OjQxOTQzNjgsOTUwMjcyOjQxOTg0NjQsMTAxNTgwODoyMTQ3NDgzNzEyLDEwNDg1NzY6NDE5NDM2OCwxMTE0MTEyOjQxOTg0MDAsMTE3OTY0ODoyMTQ3NDgzNzEyLDEyNDUxODQ6MCwxMzEwNzIwOjQxNjAsMTM3NjI1NjoyMTUxNjc4MDE2LDE0NDE3OTI6MjE1MTY4MjA0OCwxNTA3MzI4OjIxNDc0ODc4MDgsMTU3Mjg2NDoyMTUxNjgyMTEyLDE2Mzg0MDA6MjE0NzQ4MzY0OCwxNzAzOTM2OjIxNTE2Nzc5NTIsMTc2OTQ3Mjo0MTk4NDY0LDE4MzUwMDg6MjE0NzQ4Nzc0NCwxOTAwNTQ0OjQxOTQzMDQsMTk2NjA4MDo2NCwyMDMxNjE2OjQwOTYsMTA4MTM0NDoyMTUxNjc3OTUyLFxuMTE0Njg4MDoyMTUxNjgyMTEyLDEyMTI0MTY6MCwxMjc3OTUyOjQxOTg0MDAsMTM0MzQ4ODo0MTk0MzY4LDE0MDkwMjQ6MjE0NzQ4MzY0OCwxNDc0NTYwOjIxNDc0ODc4MDgsMTU0MDA5Njo2NCwxNjA1NjMyOjIxNDc0ODM3MTIsMTY3MTE2ODo0MDk2LDE3MzY3MDQ6MjE0NzQ4Nzc0NCwxODAyMjQwOjIxNTE2NzgwMTYsMTg2Nzc3Njo0MTYwLDE5MzMzMTI6MjE1MTY4MjA0OCwxOTk4ODQ4OjQxOTQzMDQsMjA2NDM4NDo0MTk4NDY0fSx7XCIwXCI6MTI4LDQwOTY6MTcwMzkzNjAsODE5MjoyNjIxNDQsMTIyODg6NTM2ODcwOTEyLDE2Mzg0OjUzNzEzMzE4NCwyMDQ4MDoxNjc3NzM0NCwyNDU3Njo1NTM2NDgyNTYsMjg2NzI6MjYyMjcyLDMyNzY4OjE2Nzc3MjE2LDM2ODY0OjUzNzEzMzA1Niw0MDk2MDo1MzY4NzEwNDAsNDUwNTY6NTUzOTEwNDAwLDQ5MTUyOjU1MzkxMDI3Miw1MzI0ODowLDU3MzQ0OjE3MDM5NDg4LDYxNDQwOjU1MzY0ODEyOCwyMDQ4OjE3MDM5NDg4LDYxNDQ6NTUzNjQ4MjU2LFxuMTAyNDA6MTI4LDE0MzM2OjE3MDM5MzYwLDE4NDMyOjI2MjE0NCwyMjUyODo1MzcxMzMxODQsMjY2MjQ6NTUzOTEwMjcyLDMwNzIwOjUzNjg3MDkxMiwzNDgxNjo1MzcxMzMwNTYsMzg5MTI6MCw0MzAwODo1NTM5MTA0MDAsNDcxMDQ6MTY3NzczNDQsNTEyMDA6NTM2ODcxMDQwLDU1Mjk2OjU1MzY0ODEyOCw1OTM5MjoxNjc3NzIxNiw2MzQ4ODoyNjIyNzIsNjU1MzY6MjYyMTQ0LDY5NjMyOjEyOCw3MzcyODo1MzY4NzA5MTIsNzc4MjQ6NTUzNjQ4MjU2LDgxOTIwOjE2Nzc3MzQ0LDg2MDE2OjU1MzkxMDI3Miw5MDExMjo1MzcxMzMxODQsOTQyMDg6MTY3NzcyMTYsOTgzMDQ6NTUzOTEwNDAwLDEwMjQwMDo1NTM2NDgxMjgsMTA2NDk2OjE3MDM5MzYwLDExMDU5Mjo1MzcxMzMwNTYsMTE0Njg4OjI2MjI3MiwxMTg3ODQ6NTM2ODcxMDQwLDEyMjg4MDowLDEyNjk3NjoxNzAzOTQ4OCw2NzU4NDo1NTM2NDgyNTYsNzE2ODA6MTY3NzcyMTYsNzU3NzY6MTcwMzkzNjAsNzk4NzI6NTM3MTMzMTg0LFxuODM5Njg6NTM2ODcwOTEyLDg4MDY0OjE3MDM5NDg4LDkyMTYwOjEyOCw5NjI1Njo1NTM5MTAyNzIsMTAwMzUyOjI2MjI3MiwxMDQ0NDg6NTUzOTEwNDAwLDEwODU0NDowLDExMjY0MDo1NTM2NDgxMjgsMTE2NzM2OjE2Nzc3MzQ0LDEyMDgzMjoyNjIxNDQsMTI0OTI4OjUzNzEzMzA1NiwxMjkwMjQ6NTM2ODcxMDQwfSx7XCIwXCI6MjY4NDM1NDY0LDI1Njo4MTkyLDUxMjoyNzA1MzI2MDgsNzY4OjI3MDU0MDgwOCwxMDI0OjI2ODQ0MzY0OCwxMjgwOjIwOTcxNTIsMTUzNjoyMDk3MTYwLDE3OTI6MjY4NDM1NDU2LDIwNDg6MCwyMzA0OjI2ODQ0MzY1NiwyNTYwOjIxMDUzNDQsMjgxNjo4LDMwNzI6MjcwNTMyNjE2LDMzMjg6MjEwNTM1MiwzNTg0OjgyMDAsMzg0MDoyNzA1NDA4MDAsMTI4OjI3MDUzMjYwOCwzODQ6MjcwNTQwODA4LDY0MDo4LDg5NjoyMDk3MTUyLDExNTI6MjEwNTM1MiwxNDA4OjI2ODQzNTQ2NCwxNjY0OjI2ODQ0MzY0OCwxOTIwOjgyMDAsMjE3NjoyMDk3MTYwLDI0MzI6ODE5MixcbjI2ODg6MjY4NDQzNjU2LDI5NDQ6MjcwNTMyNjE2LDMyMDA6MCwzNDU2OjI3MDU0MDgwMCwzNzEyOjIxMDUzNDQsMzk2ODoyNjg0MzU0NTYsNDA5NjoyNjg0NDM2NDgsNDM1MjoyNzA1MzI2MTYsNDYwODoyNzA1NDA4MDgsNDg2NDo4MjAwLDUxMjA6MjA5NzE1Miw1Mzc2OjI2ODQzNTQ1Niw1NjMyOjI2ODQzNTQ2NCw1ODg4OjIxMDUzNDQsNjE0NDoyMTA1MzUyLDY0MDA6MCw2NjU2OjgsNjkxMjoyNzA1MzI2MDgsNzE2ODo4MTkyLDc0MjQ6MjY4NDQzNjU2LDc2ODA6MjcwNTQwODAwLDc5MzY6MjA5NzE2MCw0MjI0OjgsNDQ4MDoyMTA1MzQ0LDQ3MzY6MjA5NzE1Miw0OTkyOjI2ODQzNTQ2NCw1MjQ4OjI2ODQ0MzY0OCw1NTA0OjgyMDAsNTc2MDoyNzA1NDA4MDgsNjAxNjoyNzA1MzI2MDgsNjI3MjoyNzA1NDA4MDAsNjUyODoyNzA1MzI2MTYsNjc4NDo4MTkyLDcwNDA6MjEwNTM1Miw3Mjk2OjIwOTcxNjAsNzU1MjowLDc4MDg6MjY4NDM1NDU2LDgwNjQ6MjY4NDQzNjU2fSx7XCIwXCI6MTA0ODU3NixcbjE2OjMzNTU1NDU3LDMyOjEwMjQsNDg6MTA0OTYwMSw2NDozNDYwNDAzMyw4MDowLDk2OjEsMTEyOjM0NjAzMDA5LDEyODozMzU1NTQ1NiwxNDQ6MTA0ODU3NywxNjA6MzM1NTQ0MzMsMTc2OjM0NjA0MDMyLDE5MjozNDYwMzAwOCwyMDg6MTAyNSwyMjQ6MTA0OTYwMCwyNDA6MzM1NTQ0MzIsODozNDYwMzAwOSwyNDowLDQwOjMzNTU1NDU3LDU2OjM0NjA0MDMyLDcyOjEwNDg1NzYsODg6MzM1NTQ0MzMsMTA0OjMzNTU0NDMyLDEyMDoxMDI1LDEzNjoxMDQ5NjAxLDE1MjozMzU1NTQ1NiwxNjg6MzQ2MDMwMDgsMTg0OjEwNDg1NzcsMjAwOjEwMjQsMjE2OjM0NjA0MDMzLDIzMjoxLDI0ODoxMDQ5NjAwLDI1NjozMzU1NDQzMiwyNzI6MTA0ODU3NiwyODg6MzM1NTU0NTcsMzA0OjM0NjAzMDA5LDMyMDoxMDQ4NTc3LDMzNjozMzU1NTQ1NiwzNTI6MzQ2MDQwMzIsMzY4OjEwNDk2MDEsMzg0OjEwMjUsNDAwOjM0NjA0MDMzLDQxNjoxMDQ5NjAwLDQzMjoxLDQ0ODowLDQ2NDozNDYwMzAwOCw0ODA6MzM1NTQ0MzMsXG40OTY6MTAyNCwyNjQ6MTA0OTYwMCwyODA6MzM1NTU0NTcsMjk2OjM0NjAzMDA5LDMxMjoxLDMyODozMzU1NDQzMiwzNDQ6MTA0ODU3NiwzNjA6MTAyNSwzNzY6MzQ2MDQwMzIsMzkyOjMzNTU0NDMzLDQwODozNDYwMzAwOCw0MjQ6MCw0NDA6MzQ2MDQwMzMsNDU2OjEwNDk2MDEsNDcyOjEwMjQsNDg4OjMzNTU1NDU2LDUwNDoxMDQ4NTc3fSx7XCIwXCI6MTM0MjE5ODA4LDE6MTMxMDcyLDI6MTM0MjE3NzI4LDM6MzIsNDoxMzExMDQsNToxMzQzNTA4ODAsNjoxMzQzNTA4NDgsNzoyMDQ4LDg6MTM0MzQ4ODAwLDk6MTM0MjE5Nzc2LDEwOjEzMzEyMCwxMToxMzQzNDg4MzIsMTI6MjA4MCwxMzowLDE0OjEzNDIxNzc2MCwxNToxMzMxNTIsMjE0NzQ4MzY0ODoyMDQ4LDIxNDc0ODM2NDk6MTM0MzUwODgwLDIxNDc0ODM2NTA6MTM0MjE5ODA4LDIxNDc0ODM2NTE6MTM0MjE3NzI4LDIxNDc0ODM2NTI6MTM0MzQ4ODAwLDIxNDc0ODM2NTM6MTMzMTIwLDIxNDc0ODM2NTQ6MTMzMTUyLDIxNDc0ODM2NTU6MzIsXG4yMTQ3NDgzNjU2OjEzNDIxNzc2MCwyMTQ3NDgzNjU3OjIwODAsMjE0NzQ4MzY1ODoxMzExMDQsMjE0NzQ4MzY1OToxMzQzNTA4NDgsMjE0NzQ4MzY2MDowLDIxNDc0ODM2NjE6MTM0MzQ4ODMyLDIxNDc0ODM2NjI6MTM0MjE5Nzc2LDIxNDc0ODM2NjM6MTMxMDcyLDE2OjEzMzE1MiwxNzoxMzQzNTA4NDgsMTg6MzIsMTk6MjA0OCwyMDoxMzQyMTk3NzYsMjE6MTM0MjE3NzYwLDIyOjEzNDM0ODgzMiwyMzoxMzEwNzIsMjQ6MCwyNToxMzExMDQsMjY6MTM0MzQ4ODAwLDI3OjEzNDIxOTgwOCwyODoxMzQzNTA4ODAsMjk6MTMzMTIwLDMwOjIwODAsMzE6MTM0MjE3NzI4LDIxNDc0ODM2NjQ6MTMxMDcyLDIxNDc0ODM2NjU6MjA0OCwyMTQ3NDgzNjY2OjEzNDM0ODgzMiwyMTQ3NDgzNjY3OjEzMzE1MiwyMTQ3NDgzNjY4OjMyLDIxNDc0ODM2Njk6MTM0MzQ4ODAwLDIxNDc0ODM2NzA6MTM0MjE3NzI4LDIxNDc0ODM2NzE6MTM0MjE5ODA4LDIxNDc0ODM2NzI6MTM0MzUwODgwLDIxNDc0ODM2NzM6MTM0MjE3NzYwLFxuMjE0NzQ4MzY3NDoxMzQyMTk3NzYsMjE0NzQ4MzY3NTowLDIxNDc0ODM2NzY6MTMzMTIwLDIxNDc0ODM2Nzc6MjA4MCwyMTQ3NDgzNjc4OjEzMTEwNCwyMTQ3NDgzNjc5OjEzNDM1MDg0OH1dLHQ9WzQxNjA3NDk1NjksNTI4NDgyMzA0LDMzMDMwMTQ0LDIwNjQzODQsMTI5MDI0LDgwNjQsNTA0LDIxNDc0ODM2NzldLG09Zy5ERVM9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2tleS53b3JkcyxjPVtdLGE9MDs1Nj5hO2ErKyl7dmFyIGY9cVthXS0xO2NbYV09YltmPj4+NV0+Pj4zMS1mJTMyJjF9Yj10aGlzLl9zdWJLZXlzPVtdO2ZvcihmPTA7MTY+ZjtmKyspe2Zvcih2YXIgZD1iW2ZdPVtdLGU9cltmXSxhPTA7MjQ+YTthKyspZFthLzZ8MF18PWNbKHBbYV0tMStlKSUyOF08PDMxLWElNixkWzQrKGEvNnwwKV18PWNbMjgrKHBbYSsyNF0tMStlKSUyOF08PDMxLWElNjtkWzBdPWRbMF08PDF8ZFswXT4+PjMxO2ZvcihhPTE7Nz5hO2ErKylkW2FdPj4+PVxuNCooYS0xKSszO2RbN109ZFs3XTw8NXxkWzddPj4+Mjd9Yz10aGlzLl9pbnZTdWJLZXlzPVtdO2ZvcihhPTA7MTY+YTthKyspY1thXT1iWzE1LWFdfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kb0NyeXB0QmxvY2soYixjLHRoaXMuX3N1YktleXMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kb0NyeXB0QmxvY2soYixjLHRoaXMuX2ludlN1YktleXMpfSxfZG9DcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyxhKXt0aGlzLl9sQmxvY2s9YltjXTt0aGlzLl9yQmxvY2s9YltjKzFdO2ouY2FsbCh0aGlzLDQsMjUyNjQ1MTM1KTtqLmNhbGwodGhpcywxNiw2NTUzNSk7bC5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpO2wuY2FsbCh0aGlzLDgsMTY3MTE5MzUpO2ouY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7Zm9yKHZhciBmPTA7MTY+ZjtmKyspe2Zvcih2YXIgZD1hW2ZdLGU9dGhpcy5fbEJsb2NrLGg9dGhpcy5fckJsb2NrLGc9MCxrPTA7OD5rO2srKylnfD1zW2tdWygoaF5cbmRba10pJnRba10pPj4+MF07dGhpcy5fbEJsb2NrPWg7dGhpcy5fckJsb2NrPWVeZ31hPXRoaXMuX2xCbG9jazt0aGlzLl9sQmxvY2s9dGhpcy5fckJsb2NrO3RoaXMuX3JCbG9jaz1hO2ouY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSk7bC5jYWxsKHRoaXMsOCwxNjcxMTkzNSk7bC5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpO2ouY2FsbCh0aGlzLDE2LDY1NTM1KTtqLmNhbGwodGhpcyw0LDI1MjY0NTEzNSk7YltjXT10aGlzLl9sQmxvY2s7YltjKzFdPXRoaXMuX3JCbG9ja30sa2V5U2l6ZToyLGl2U2l6ZToyLGJsb2NrU2l6ZToyfSk7aC5ERVM9ZS5fY3JlYXRlSGVscGVyKG0pO2c9Zy5UcmlwbGVERVM9ZS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fa2V5LndvcmRzO3RoaXMuX2RlczE9bS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSgwLDIpKSk7dGhpcy5fZGVzMj1tLmNyZWF0ZUVuY3J5cHRvcihuLmNyZWF0ZShiLnNsaWNlKDIsNCkpKTt0aGlzLl9kZXMzPVxubS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSg0LDYpKSl9LGVuY3J5cHRCbG9jazpmdW5jdGlvbihiLGMpe3RoaXMuX2RlczEuZW5jcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMi5kZWNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMzLmVuY3J5cHRCbG9jayhiLGMpfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kZXMzLmRlY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczIuZW5jcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMS5kZWNyeXB0QmxvY2soYixjKX0sa2V5U2l6ZTo2LGl2U2l6ZToyLGJsb2NrU2l6ZToyfSk7aC5UcmlwbGVERVM9ZS5fY3JlYXRlSGVscGVyKGcpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBlbmMtYmFzZTY0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgaD1DcnlwdG9KUyxqPWgubGliLldvcmRBcnJheTtoLmVuYy5CYXNlNjQ9e3N0cmluZ2lmeTpmdW5jdGlvbihiKXt2YXIgZT1iLndvcmRzLGY9Yi5zaWdCeXRlcyxjPXRoaXMuX21hcDtiLmNsYW1wKCk7Yj1bXTtmb3IodmFyIGE9MDthPGY7YSs9Mylmb3IodmFyIGQ9KGVbYT4+PjJdPj4+MjQtOCooYSU0KSYyNTUpPDwxNnwoZVthKzE+Pj4yXT4+PjI0LTgqKChhKzEpJTQpJjI1NSk8PDh8ZVthKzI+Pj4yXT4+PjI0LTgqKChhKzIpJTQpJjI1NSxnPTA7ND5nJiZhKzAuNzUqZzxmO2crKyliLnB1c2goYy5jaGFyQXQoZD4+PjYqKDMtZykmNjMpKTtpZihlPWMuY2hhckF0KDY0KSlmb3IoO2IubGVuZ3RoJTQ7KWIucHVzaChlKTtyZXR1cm4gYi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxlbmd0aCxmPXRoaXMuX21hcCxjPWYuY2hhckF0KDY0KTtjJiYoYz1iLmluZGV4T2YoYyksLTEhPWMmJihlPWMpKTtmb3IodmFyIGM9W10sYT0wLGQ9MDtkPFxuZTtkKyspaWYoZCU0KXt2YXIgZz1mLmluZGV4T2YoYi5jaGFyQXQoZC0xKSk8PDIqKGQlNCksaD1mLmluZGV4T2YoYi5jaGFyQXQoZCkpPj4+Ni0yKihkJTQpO2NbYT4+PjJdfD0oZ3xoKTw8MjQtOCooYSU0KTthKyt9cmV0dXJuIGouY3JlYXRlKGMsYSl9LF9tYXA6XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwifX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgbWQ1LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oRSl7ZnVuY3Rpb24gaChhLGYsZyxqLHAsaCxrKXthPWErKGYmZ3x+ZiZqKStwK2s7cmV0dXJuKGE8PGh8YT4+PjMyLWgpK2Z9ZnVuY3Rpb24gayhhLGYsZyxqLHAsaCxrKXthPWErKGYmanxnJn5qKStwK2s7cmV0dXJuKGE8PGh8YT4+PjMyLWgpK2Z9ZnVuY3Rpb24gbChhLGYsZyxqLGgsayxsKXthPWErKGZeZ15qKStoK2w7cmV0dXJuKGE8PGt8YT4+PjMyLWspK2Z9ZnVuY3Rpb24gbihhLGYsZyxqLGgsayxsKXthPWErKGdeKGZ8fmopKStoK2w7cmV0dXJuKGE8PGt8YT4+PjMyLWspK2Z9Zm9yKHZhciByPUNyeXB0b0pTLHE9ci5saWIsRj1xLldvcmRBcnJheSxzPXEuSGFzaGVyLHE9ci5hbGdvLGE9W10sdD0wOzY0PnQ7dCsrKWFbdF09NDI5NDk2NzI5NipFLmFicyhFLnNpbih0KzEpKXwwO3E9cS5NRDU9cy5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgRi5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdKX0sXG5fZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24obSxmKXtmb3IodmFyIGc9MDsxNj5nO2crKyl7dmFyIGo9ZitnLHA9bVtqXTttW2pdPShwPDw4fHA+Pj4yNCkmMTY3MTE5MzV8KHA8PDI0fHA+Pj44KSY0Mjc4MjU1MzYwfXZhciBnPXRoaXMuX2hhc2gud29yZHMsaj1tW2YrMF0scD1tW2YrMV0scT1tW2YrMl0scj1tW2YrM10scz1tW2YrNF0sdD1tW2YrNV0sdT1tW2YrNl0sdj1tW2YrN10sdz1tW2YrOF0seD1tW2YrOV0seT1tW2YrMTBdLHo9bVtmKzExXSxBPW1bZisxMl0sQj1tW2YrMTNdLEM9bVtmKzE0XSxEPW1bZisxNV0sYj1nWzBdLGM9Z1sxXSxkPWdbMl0sZT1nWzNdLGI9aChiLGMsZCxlLGosNyxhWzBdKSxlPWgoZSxiLGMsZCxwLDEyLGFbMV0pLGQ9aChkLGUsYixjLHEsMTcsYVsyXSksYz1oKGMsZCxlLGIsciwyMixhWzNdKSxiPWgoYixjLGQsZSxzLDcsYVs0XSksZT1oKGUsYixjLGQsdCwxMixhWzVdKSxkPWgoZCxlLGIsYyx1LDE3LGFbNl0pLGM9aChjLGQsZSxiLHYsMjIsYVs3XSksXG5iPWgoYixjLGQsZSx3LDcsYVs4XSksZT1oKGUsYixjLGQseCwxMixhWzldKSxkPWgoZCxlLGIsYyx5LDE3LGFbMTBdKSxjPWgoYyxkLGUsYix6LDIyLGFbMTFdKSxiPWgoYixjLGQsZSxBLDcsYVsxMl0pLGU9aChlLGIsYyxkLEIsMTIsYVsxM10pLGQ9aChkLGUsYixjLEMsMTcsYVsxNF0pLGM9aChjLGQsZSxiLEQsMjIsYVsxNV0pLGI9ayhiLGMsZCxlLHAsNSxhWzE2XSksZT1rKGUsYixjLGQsdSw5LGFbMTddKSxkPWsoZCxlLGIsYyx6LDE0LGFbMThdKSxjPWsoYyxkLGUsYixqLDIwLGFbMTldKSxiPWsoYixjLGQsZSx0LDUsYVsyMF0pLGU9ayhlLGIsYyxkLHksOSxhWzIxXSksZD1rKGQsZSxiLGMsRCwxNCxhWzIyXSksYz1rKGMsZCxlLGIscywyMCxhWzIzXSksYj1rKGIsYyxkLGUseCw1LGFbMjRdKSxlPWsoZSxiLGMsZCxDLDksYVsyNV0pLGQ9ayhkLGUsYixjLHIsMTQsYVsyNl0pLGM9ayhjLGQsZSxiLHcsMjAsYVsyN10pLGI9ayhiLGMsZCxlLEIsNSxhWzI4XSksZT1rKGUsYixcbmMsZCxxLDksYVsyOV0pLGQ9ayhkLGUsYixjLHYsMTQsYVszMF0pLGM9ayhjLGQsZSxiLEEsMjAsYVszMV0pLGI9bChiLGMsZCxlLHQsNCxhWzMyXSksZT1sKGUsYixjLGQsdywxMSxhWzMzXSksZD1sKGQsZSxiLGMseiwxNixhWzM0XSksYz1sKGMsZCxlLGIsQywyMyxhWzM1XSksYj1sKGIsYyxkLGUscCw0LGFbMzZdKSxlPWwoZSxiLGMsZCxzLDExLGFbMzddKSxkPWwoZCxlLGIsYyx2LDE2LGFbMzhdKSxjPWwoYyxkLGUsYix5LDIzLGFbMzldKSxiPWwoYixjLGQsZSxCLDQsYVs0MF0pLGU9bChlLGIsYyxkLGosMTEsYVs0MV0pLGQ9bChkLGUsYixjLHIsMTYsYVs0Ml0pLGM9bChjLGQsZSxiLHUsMjMsYVs0M10pLGI9bChiLGMsZCxlLHgsNCxhWzQ0XSksZT1sKGUsYixjLGQsQSwxMSxhWzQ1XSksZD1sKGQsZSxiLGMsRCwxNixhWzQ2XSksYz1sKGMsZCxlLGIscSwyMyxhWzQ3XSksYj1uKGIsYyxkLGUsaiw2LGFbNDhdKSxlPW4oZSxiLGMsZCx2LDEwLGFbNDldKSxkPW4oZCxlLGIsYyxcbkMsMTUsYVs1MF0pLGM9bihjLGQsZSxiLHQsMjEsYVs1MV0pLGI9bihiLGMsZCxlLEEsNixhWzUyXSksZT1uKGUsYixjLGQsciwxMCxhWzUzXSksZD1uKGQsZSxiLGMseSwxNSxhWzU0XSksYz1uKGMsZCxlLGIscCwyMSxhWzU1XSksYj1uKGIsYyxkLGUsdyw2LGFbNTZdKSxlPW4oZSxiLGMsZCxELDEwLGFbNTddKSxkPW4oZCxlLGIsYyx1LDE1LGFbNThdKSxjPW4oYyxkLGUsYixCLDIxLGFbNTldKSxiPW4oYixjLGQsZSxzLDYsYVs2MF0pLGU9bihlLGIsYyxkLHosMTAsYVs2MV0pLGQ9bihkLGUsYixjLHEsMTUsYVs2Ml0pLGM9bihjLGQsZSxiLHgsMjEsYVs2M10pO2dbMF09Z1swXStifDA7Z1sxXT1nWzFdK2N8MDtnWzJdPWdbMl0rZHwwO2dbM109Z1szXStlfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZGF0YSxmPWEud29yZHMsZz04KnRoaXMuX25EYXRhQnl0ZXMsaj04KmEuc2lnQnl0ZXM7ZltqPj4+NV18PTEyODw8MjQtaiUzMjt2YXIgaD1FLmZsb29yKGcvXG40Mjk0OTY3Mjk2KTtmWyhqKzY0Pj4+OTw8NCkrMTVdPShoPDw4fGg+Pj4yNCkmMTY3MTE5MzV8KGg8PDI0fGg+Pj44KSY0Mjc4MjU1MzYwO2ZbKGorNjQ+Pj45PDw0KSsxNF09KGc8PDh8Zz4+PjI0KSYxNjcxMTkzNXwoZzw8MjR8Zz4+PjgpJjQyNzgyNTUzNjA7YS5zaWdCeXRlcz00KihmLmxlbmd0aCsxKTt0aGlzLl9wcm9jZXNzKCk7YT10aGlzLl9oYXNoO2Y9YS53b3Jkcztmb3IoZz0wOzQ+ZztnKyspaj1mW2ddLGZbZ109KGo8PDh8aj4+PjI0KSYxNjcxMTkzNXwoajw8MjR8aj4+PjgpJjQyNzgyNTUzNjA7cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGE9cy5jbG9uZS5jYWxsKHRoaXMpO2EuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBhfX0pO3IuTUQ1PXMuX2NyZWF0ZUhlbHBlcihxKTtyLkhtYWNNRDU9cy5fY3JlYXRlSG1hY0hlbHBlcihxKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTEtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBrPUNyeXB0b0pTLGI9ay5saWIsbT1iLldvcmRBcnJheSxsPWIuSGFzaGVyLGQ9W10sYj1rLmFsZ28uU0hBMT1sLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBtLmluaXQoWzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihuLHApe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGU9YVswXSxmPWFbMV0saD1hWzJdLGo9YVszXSxiPWFbNF0sYz0wOzgwPmM7YysrKXtpZigxNj5jKWRbY109bltwK2NdfDA7ZWxzZXt2YXIgZz1kW2MtM11eZFtjLThdXmRbYy0xNF1eZFtjLTE2XTtkW2NdPWc8PDF8Zz4+PjMxfWc9KGU8PDV8ZT4+PjI3KStiK2RbY107Zz0yMD5jP2crKChmJmh8fmYmaikrMTUxODUwMDI0OSk6NDA+Yz9nKygoZl5oXmopKzE4NTk3NzUzOTMpOjYwPmM/ZysoKGYmaHxmJmp8aCZqKS0xODk0MDA3NTg4KTpnKygoZl5oXlxuaiktODk5NDk3NTE0KTtiPWo7aj1oO2g9Zjw8MzB8Zj4+PjI7Zj1lO2U9Z31hWzBdPWFbMF0rZXwwO2FbMV09YVsxXStmfDA7YVsyXT1hWzJdK2h8MDthWzNdPWFbM10ranwwO2FbNF09YVs0XStifDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fZGF0YSxkPWIud29yZHMsYT04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmIuc2lnQnl0ZXM7ZFtlPj4+NV18PTEyODw8MjQtZSUzMjtkWyhlKzY0Pj4+OTw8NCkrMTRdPU1hdGguZmxvb3IoYS80Mjk0OTY3Mjk2KTtkWyhlKzY0Pj4+OTw8NCkrMTVdPWE7Yi5zaWdCeXRlcz00KmQubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpcy5faGFzaH0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYj1sLmNsb25lLmNhbGwodGhpcyk7Yi5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGJ9fSk7ay5TSEExPWwuX2NyZWF0ZUhlbHBlcihiKTtrLkhtYWNTSEExPWwuX2NyZWF0ZUhtYWNIZWxwZXIoYil9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTI1Ni1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKGspe2Zvcih2YXIgZz1DcnlwdG9KUyxoPWcubGliLHY9aC5Xb3JkQXJyYXksaj1oLkhhc2hlcixoPWcuYWxnbyxzPVtdLHQ9W10sdT1mdW5jdGlvbihxKXtyZXR1cm4gNDI5NDk2NzI5NioocS0ocXwwKSl8MH0sbD0yLGI9MDs2ND5iOyl7dmFyIGQ7YTp7ZD1sO2Zvcih2YXIgdz1rLnNxcnQoZCkscj0yO3I8PXc7cisrKWlmKCEoZCVyKSl7ZD0hMTticmVhayBhfWQ9ITB9ZCYmKDg+YiYmKHNbYl09dShrLnBvdyhsLDAuNSkpKSx0W2JdPXUoay5wb3cobCwxLzMpKSxiKyspO2wrK312YXIgbj1bXSxoPWguU0hBMjU2PWouZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHYuaW5pdChzLnNsaWNlKDApKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHEsaCl7Zm9yKHZhciBhPXRoaXMuX2hhc2gud29yZHMsYz1hWzBdLGQ9YVsxXSxiPWFbMl0saz1hWzNdLGY9YVs0XSxnPWFbNV0saj1hWzZdLGw9YVs3XSxlPTA7NjQ+ZTtlKyspe2lmKDE2PmUpbltlXT1cbnFbaCtlXXwwO2Vsc2V7dmFyIG09bltlLTE1XSxwPW5bZS0yXTtuW2VdPSgobTw8MjV8bT4+PjcpXihtPDwxNHxtPj4+MTgpXm0+Pj4zKStuW2UtN10rKChwPDwxNXxwPj4+MTcpXihwPDwxM3xwPj4+MTkpXnA+Pj4xMCkrbltlLTE2XX1tPWwrKChmPDwyNnxmPj4+NileKGY8PDIxfGY+Pj4xMSleKGY8PDd8Zj4+PjI1KSkrKGYmZ15+ZiZqKSt0W2VdK25bZV07cD0oKGM8PDMwfGM+Pj4yKV4oYzw8MTl8Yz4+PjEzKV4oYzw8MTB8Yz4+PjIyKSkrKGMmZF5jJmJeZCZiKTtsPWo7aj1nO2c9ZjtmPWsrbXwwO2s9YjtiPWQ7ZD1jO2M9bStwfDB9YVswXT1hWzBdK2N8MDthWzFdPWFbMV0rZHwwO2FbMl09YVsyXStifDA7YVszXT1hWzNdK2t8MDthWzRdPWFbNF0rZnwwO2FbNV09YVs1XStnfDA7YVs2XT1hWzZdK2p8MDthWzddPWFbN10rbHwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBkPXRoaXMuX2RhdGEsYj1kLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGM9OCpkLnNpZ0J5dGVzO1xuYltjPj4+NV18PTEyODw8MjQtYyUzMjtiWyhjKzY0Pj4+OTw8NCkrMTRdPWsuZmxvb3IoYS80Mjk0OTY3Mjk2KTtiWyhjKzY0Pj4+OTw8NCkrMTVdPWE7ZC5zaWdCeXRlcz00KmIubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpcy5faGFzaH0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYj1qLmNsb25lLmNhbGwodGhpcyk7Yi5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGJ9fSk7Zy5TSEEyNTY9ai5fY3JlYXRlSGVscGVyKGgpO2cuSG1hY1NIQTI1Nj1qLl9jcmVhdGVIbWFjSGVscGVyKGgpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMjI0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYj1DcnlwdG9KUyxkPWIubGliLldvcmRBcnJheSxhPWIuYWxnbyxjPWEuU0hBMjU2LGE9YS5TSEEyMjQ9Yy5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgZC5pbml0KFszMjM4MzcxMDMyLDkxNDE1MDY2Myw4MTI3MDI5OTksNDE0NDkxMjY5Nyw0MjkwNzc1ODU3LDE3NTA2MDMwMjUsMTY5NDA3NjgzOSwzMjA0MDc1NDI4XSl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9Yy5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpO2Euc2lnQnl0ZXMtPTQ7cmV0dXJuIGF9fSk7Yi5TSEEyMjQ9Yy5fY3JlYXRlSGVscGVyKGEpO2IuSG1hY1NIQTIyND1jLl9jcmVhdGVIbWFjSGVscGVyKGEpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGE1MTItbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gZC5jcmVhdGUuYXBwbHkoZCxhcmd1bWVudHMpfWZvcih2YXIgbj1DcnlwdG9KUyxyPW4ubGliLkhhc2hlcixlPW4ueDY0LGQ9ZS5Xb3JkLFQ9ZS5Xb3JkQXJyYXksZT1uLmFsZ28sZWE9W2EoMTExNjM1MjQwOCwzNjA5NzY3NDU4KSxhKDE4OTk0NDc0NDEsNjAyODkxNzI1KSxhKDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSksYSgzOTIxMDA5NTczLDIxNzMyOTU1NDgpLGEoOTYxOTg3MTYzLDQwODE2Mjg0NzIpLGEoMTUwODk3MDk5MywzMDUzODM0MjY1KSxhKDI0NTM2MzU3NDgsMjkzNzY3MTU3OSksYSgyODcwNzYzMjIxLDM2NjQ2MDk1NjApLGEoMzYyNDM4MTA4MCwyNzM0ODgzMzk0KSxhKDMxMDU5ODQwMSwxMTY0OTk2NTQyKSxhKDYwNzIyNTI3OCwxMzIzNjEwNzY0KSxhKDE0MjY4ODE5ODcsMzU5MDMwNDk5NCksYSgxOTI1MDc4Mzg4LDQwNjgxODIzODMpLGEoMjE2MjA3ODIwNiw5OTEzMzYxMTMpLGEoMjYxNDg4ODEwMyw2MzM4MDMzMTcpLFxuYSgzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgpLGEoMzgzNTM5MDQwMSwyNjY2NjEzNDU4KSxhKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxhKDI2NDM0NzA3OCwyMzQxMjYyNzczKSxhKDYwNDgwNzYyOCwyMDA3ODAwOTMzKSxhKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxhKDEyNDkxNTAxMjIsMTg1NjQzMTIzNSksYSgxNTU1MDgxNjkyLDMxNzUyMTgxMzIpLGEoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxhKDI1NTQyMjA4ODIsMzk5OTcxOTMzOSksYSgyODIxODM0MzQ5LDc2Njc4NDAxNiksYSgyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLGEoMzIxMDMxMzY3MSwzMjAzMzM3OTU2KSxhKDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiksYSgzNTg0NTI4NzExLDI0NjY5NDg5MDEpLGEoMTEzOTI2OTkzLDM3NTgzMjYzODMpLGEoMzM4MjQxODk1LDE2ODcxNzkzNiksYSg2NjYzMDcyMDUsMTE4ODE3OTk2NCksYSg3NzM1Mjk5MTIsMTU0NjA0NTczNCksYSgxMjk0NzU3MzcyLDE1MjI4MDU0ODUpLGEoMTM5NjE4MjI5MSxcbjI2NDM4MzM4MjMpLGEoMTY5NTE4MzcwMCwyMzQzNTI3MzkwKSxhKDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCksYSgyMTc3MDI2MzUwLDEyMDY3NTkxNDIpLGEoMjQ1Njk1NjAzNywzNDQwNzc2MjcpLGEoMjczMDQ4NTkyMSwxMjkwODYzNDYwKSxhKDI4MjAzMDI0MTEsMzE1ODQ1NDI3MyksYSgzMjU5NzMwODAwLDM1MDU5NTI2NTcpLGEoMzM0NTc2NDc3MSwxMDYyMTcwMDgpLGEoMzUxNjA2NTgxNywzNjA2MDA4MzQ0KSxhKDM2MDAzNTI4MDQsMTQzMjcyNTc3NiksYSg0MDk0NTcxOTA5LDE0NjcwMzE1OTQpLGEoMjc1NDIzMzQ0LDg1MTE2OTcyMCksYSg0MzAyMjc3MzQsMzEwMDgyMzc1MiksYSg1MDY5NDg2MTYsMTM2MzI1ODE5NSksYSg2NTkwNjA1NTYsMzc1MDY4NTU5MyksYSg4ODM5OTc4NzcsMzc4NTA1MDI4MCksYSg5NTgxMzk1NzEsMzMxODMwNzQyNyksYSgxMzIyODIyMjE4LDM4MTI3MjM0MDMpLGEoMTUzNzAwMjA2MywyMDAzMDM0OTk1KSxhKDE3NDc4NzM3NzksMzYwMjAzNjg5OSksXG5hKDE5NTU1NjIyMjIsMTU3NTk5MDAxMiksYSgyMDI0MTA0ODE1LDExMjU1OTI5MjgpLGEoMjIyNzczMDQ1MiwyNzE2OTA0MzA2KSxhKDIzNjE4NTI0MjQsNDQyNzc2MDQ0KSxhKDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSxhKDI3NTY3MzQxODcsMzczMzExMDI0OSksYSgzMjA0MDMxNDc5LDI5OTkzNTE1NzMpLGEoMzMyOTMyNTI5OCwzODE1OTIwNDI3KSxhKDMzOTE1Njk2MTQsMzkyODM4MzkwMCksYSgzNTE1MjY3MjcxLDU2NjI4MDcxMSksYSgzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLGEoNDExODYzMDI3MSw0MDAwMjM5OTkyKSxhKDExNjQxODQ3NCwxOTE0MTM4NTU0KSxhKDE3NDI5MjQyMSwyNzMxMDU1MjcwKSxhKDI4OTM4MDM1NiwzMjAzOTkzMDA2KSxhKDQ2MDM5MzI2OSwzMjA2MjAzMTUpLGEoNjg1NDcxNzMzLDU4NzQ5NjgzNiksYSg4NTIxNDI5NzEsMTA4Njc5Mjg1MSksYSgxMDE3MDM2Mjk4LDM2NTU0MzEwMCksYSgxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLGEoMTI4ODAzMzQ3MCxcbjM0MDk4NTUxNTgpLGEoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxhKDE2MDcxNjc5MTUsOTg3MTY3NDY4KSxhKDE4MTY0MDIzMTYsMTI0NjE4OTU5MSldLHY9W10sdz0wOzgwPnc7dysrKXZbd109YSgpO2U9ZS5TSEE1MTI9ci5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgVC5pbml0KFtuZXcgZC5pbml0KDE3NzkwMzM3MDMsNDA4OTIzNTcyMCksbmV3IGQuaW5pdCgzMTQ0MTM0Mjc3LDIyMjc4NzM1OTUpLG5ldyBkLmluaXQoMTAxMzkwNDI0Miw0MjcxMTc1NzIzKSxuZXcgZC5pbml0KDI3NzM0ODA3NjIsMTU5NTc1MDEyOSksbmV3IGQuaW5pdCgxMzU5ODkzMTE5LDI5MTc1NjUxMzcpLG5ldyBkLmluaXQoMjYwMDgyMjkyNCw3MjU1MTExOTkpLG5ldyBkLmluaXQoNTI4NzM0NjM1LDQyMTUzODk1NDcpLG5ldyBkLmluaXQoMTU0MTQ1OTIyNSwzMjcwMzMyMDkpXSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGQpe2Zvcih2YXIgZj10aGlzLl9oYXNoLndvcmRzLFxuRj1mWzBdLGU9ZlsxXSxuPWZbMl0scj1mWzNdLEc9Zls0XSxIPWZbNV0sST1mWzZdLGY9Zls3XSx3PUYuaGlnaCxKPUYubG93LFg9ZS5oaWdoLEs9ZS5sb3csWT1uLmhpZ2gsTD1uLmxvdyxaPXIuaGlnaCxNPXIubG93LCQ9Ry5oaWdoLE49Ry5sb3csYWE9SC5oaWdoLE89SC5sb3csYmE9SS5oaWdoLFA9SS5sb3csY2E9Zi5oaWdoLFE9Zi5sb3csaz13LGc9Six6PVgseD1LLEE9WSx5PUwsVT1aLEI9TSxsPSQsaD1OLFI9YWEsQz1PLFM9YmEsRD1QLFY9Y2EsRT1RLG09MDs4MD5tO20rKyl7dmFyIHM9dlttXTtpZigxNj5tKXZhciBqPXMuaGlnaD1hW2QrMiptXXwwLGI9cy5sb3c9YVtkKzIqbSsxXXwwO2Vsc2V7dmFyIGo9dlttLTE1XSxiPWouaGlnaCxwPWoubG93LGo9KGI+Pj4xfHA8PDMxKV4oYj4+Pjh8cDw8MjQpXmI+Pj43LHA9KHA+Pj4xfGI8PDMxKV4ocD4+Pjh8Yjw8MjQpXihwPj4+N3xiPDwyNSksdT12W20tMl0sYj11LmhpZ2gsYz11Lmxvdyx1PShiPj4+MTl8Yzw8MTMpXihiPDxcbjN8Yz4+PjI5KV5iPj4+NixjPShjPj4+MTl8Yjw8MTMpXihjPDwzfGI+Pj4yOSleKGM+Pj42fGI8PDI2KSxiPXZbbS03XSxXPWIuaGlnaCx0PXZbbS0xNl0scT10LmhpZ2gsdD10LmxvdyxiPXArYi5sb3csaj1qK1crKGI+Pj4wPHA+Pj4wPzE6MCksYj1iK2Msaj1qK3UrKGI+Pj4wPGM+Pj4wPzE6MCksYj1iK3Qsaj1qK3ErKGI+Pj4wPHQ+Pj4wPzE6MCk7cy5oaWdoPWo7cy5sb3c9Yn12YXIgVz1sJlJefmwmUyx0PWgmQ15+aCZELHM9ayZ6XmsmQV56JkEsVD1nJnheZyZ5XngmeSxwPShrPj4+Mjh8Zzw8NCleKGs8PDMwfGc+Pj4yKV4oazw8MjV8Zz4+PjcpLHU9KGc+Pj4yOHxrPDw0KV4oZzw8MzB8az4+PjIpXihnPDwyNXxrPj4+NyksYz1lYVttXSxmYT1jLmhpZ2gsZGE9Yy5sb3csYz1FKygoaD4+PjE0fGw8PDE4KV4oaD4+PjE4fGw8PDE0KV4oaDw8MjN8bD4+PjkpKSxxPVYrKChsPj4+MTR8aDw8MTgpXihsPj4+MTh8aDw8MTQpXihsPDwyM3xoPj4+OSkpKyhjPj4+MDxFPj4+MD8xOlxuMCksYz1jK3QscT1xK1crKGM+Pj4wPHQ+Pj4wPzE6MCksYz1jK2RhLHE9cStmYSsoYz4+PjA8ZGE+Pj4wPzE6MCksYz1jK2IscT1xK2orKGM+Pj4wPGI+Pj4wPzE6MCksYj11K1Qscz1wK3MrKGI+Pj4wPHU+Pj4wPzE6MCksVj1TLEU9RCxTPVIsRD1DLFI9bCxDPWgsaD1CK2N8MCxsPVUrcSsoaD4+PjA8Qj4+PjA/MTowKXwwLFU9QSxCPXksQT16LHk9eCx6PWsseD1nLGc9YytifDAsaz1xK3MrKGc+Pj4wPGM+Pj4wPzE6MCl8MH1KPUYubG93PUorZztGLmhpZ2g9dytrKyhKPj4+MDxnPj4+MD8xOjApO0s9ZS5sb3c9Syt4O2UuaGlnaD1YK3orKEs+Pj4wPHg+Pj4wPzE6MCk7TD1uLmxvdz1MK3k7bi5oaWdoPVkrQSsoTD4+PjA8eT4+PjA/MTowKTtNPXIubG93PU0rQjtyLmhpZ2g9WitVKyhNPj4+MDxCPj4+MD8xOjApO049Ry5sb3c9TitoO0cuaGlnaD0kK2wrKE4+Pj4wPGg+Pj4wPzE6MCk7Tz1ILmxvdz1PK0M7SC5oaWdoPWFhK1IrKE8+Pj4wPEM+Pj4wPzE6MCk7UD1JLmxvdz1QK0Q7XG5JLmhpZ2g9YmErUysoUD4+PjA8RD4+PjA/MTowKTtRPWYubG93PVErRTtmLmhpZ2g9Y2ErVisoUT4+PjA8RT4+PjA/MTowKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9kYXRhLGQ9YS53b3JkcyxmPTgqdGhpcy5fbkRhdGFCeXRlcyxlPTgqYS5zaWdCeXRlcztkW2U+Pj41XXw9MTI4PDwyNC1lJTMyO2RbKGUrMTI4Pj4+MTA8PDUpKzMwXT1NYXRoLmZsb29yKGYvNDI5NDk2NzI5Nik7ZFsoZSsxMjg+Pj4xMDw8NSkrMzFdPWY7YS5zaWdCeXRlcz00KmQubGVuZ3RoO3RoaXMuX3Byb2Nlc3MoKTtyZXR1cm4gdGhpcy5faGFzaC50b1gzMigpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPXIuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX0sYmxvY2tTaXplOjMyfSk7bi5TSEE1MTI9ci5fY3JlYXRlSGVscGVyKGUpO24uSG1hY1NIQTUxMj1yLl9jcmVhdGVIbWFjSGVscGVyKGUpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEzODQtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbigpe3ZhciBjPUNyeXB0b0pTLGE9Yy54NjQsYj1hLldvcmQsZT1hLldvcmRBcnJheSxhPWMuYWxnbyxkPWEuU0hBNTEyLGE9YS5TSEEzODQ9ZC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgZS5pbml0KFtuZXcgYi5pbml0KDM0MTgwNzAzNjUsMzIzODM3MTAzMiksbmV3IGIuaW5pdCgxNjU0MjcwMjUwLDkxNDE1MDY2MyksbmV3IGIuaW5pdCgyNDM4NTI5MzcwLDgxMjcwMjk5OSksbmV3IGIuaW5pdCgzNTU0NjIzNjAsNDE0NDkxMjY5NyksbmV3IGIuaW5pdCgxNzMxNDA1NDE1LDQyOTA3NzU4NTcpLG5ldyBiLmluaXQoMjM5NDE4MDIzMSwxNzUwNjAzMDI1KSxuZXcgYi5pbml0KDM2NzUwMDg1MjUsMTY5NDA3NjgzOSksbmV3IGIuaW5pdCgxMjAzMDYyODEzLDMyMDQwNzU0MjgpXSl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9ZC5fZG9GaW5hbGl6ZS5jYWxsKHRoaXMpO2Euc2lnQnl0ZXMtPTE2O3JldHVybiBhfX0pO2MuU0hBMzg0PVxuZC5fY3JlYXRlSGVscGVyKGEpO2MuSG1hY1NIQTM4ND1kLl9jcmVhdGVIbWFjSGVscGVyKGEpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiByaXBlbWQxNjAtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbi8qXG5cbihjKSAyMDEyIGJ5IENlZHJpYyBNZXNuaWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIHE9Q3J5cHRvSlMsZD1xLmxpYixuPWQuV29yZEFycmF5LHA9ZC5IYXNoZXIsZD1xLmFsZ28seD1uLmNyZWF0ZShbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSw3LDQsMTMsMSwxMCw2LDE1LDMsMTIsMCw5LDUsMiwxNCwxMSw4LDMsMTAsMTQsNCw5LDE1LDgsMSwyLDcsMCw2LDEzLDExLDUsMTIsMSw5LDExLDEwLDAsOCwxMiw0LDEzLDMsNywxNSwxNCw1LDYsMiw0LDAsNSw5LDcsMTIsMiwxMCwxNCwxLDMsOCwxMSw2LDE1LDEzXSkseT1uLmNyZWF0ZShbNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSksej1uLmNyZWF0ZShbMTEsMTQsMTUsMTIsXG41LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSksQT1uLmNyZWF0ZShbOCw5LDksMTEsMTMsMTUsMTUsNSw3LDcsOCwxMSwxNCwxNCwxMiw2LDksMTMsMTUsNywxMiw4LDksMTEsNyw3LDEyLDcsNiwxNSwxMywxMSw5LDcsMTUsMTEsOCw2LDYsMTQsMTIsMTMsNSwxNCwxMywxMyw3LDUsMTUsNSw4LDExLDE0LDE0LDYsMTQsNiw5LDEyLDksMTIsNSwxNSw4LDgsNSwxMiw5LDEyLDUsMTQsNiw4LDEzLDYsNSwxNSwxMywxMSwxMV0pLEI9bi5jcmVhdGUoWzAsMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMjg0MDg1MzgzOF0pLEM9bi5jcmVhdGUoWzEzNTI4Mjk5MjYsMTU0ODYwMzY4NCwxODM2MDcyNjkxLFxuMjA1Mzk5NDIxNywwXSksZD1kLlJJUEVNRDE2MD1wLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW4uY3JlYXRlKFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oZSx2KXtmb3IodmFyIGI9MDsxNj5iO2IrKyl7dmFyIGM9ditiLGY9ZVtjXTtlW2NdPShmPDw4fGY+Pj4yNCkmMTY3MTE5MzV8KGY8PDI0fGY+Pj44KSY0Mjc4MjU1MzYwfXZhciBjPXRoaXMuX2hhc2gud29yZHMsZj1CLndvcmRzLGQ9Qy53b3JkcyxuPXgud29yZHMscT15LndvcmRzLHA9ei53b3Jkcyx3PUEud29yZHMsdCxnLGgsaixyLHUsayxsLG0sczt1PXQ9Y1swXTtrPWc9Y1sxXTtsPWg9Y1syXTttPWo9Y1szXTtzPXI9Y1s0XTtmb3IodmFyIGEsYj0wOzgwPmI7Yis9MSlhPXQrZVt2K25bYl1dfDAsYT0xNj5iP2ErKChnXmheaikrZlswXSk6MzI+Yj9hKygoZyZofH5nJmopK2ZbMV0pOjQ4PmI/XG5hKygoKGd8fmgpXmopK2ZbMl0pOjY0PmI/YSsoKGcmanxoJn5qKStmWzNdKTphKygoZ14oaHx+aikpK2ZbNF0pLGF8PTAsYT1hPDxwW2JdfGE+Pj4zMi1wW2JdLGE9YStyfDAsdD1yLHI9aixqPWg8PDEwfGg+Pj4yMixoPWcsZz1hLGE9dStlW3YrcVtiXV18MCxhPTE2PmI/YSsoKGteKGx8fm0pKStkWzBdKTozMj5iP2ErKChrJm18bCZ+bSkrZFsxXSk6NDg+Yj9hKygoKGt8fmwpXm0pK2RbMl0pOjY0PmI/YSsoKGsmbHx+ayZtKStkWzNdKTphKygoa15sXm0pK2RbNF0pLGF8PTAsYT1hPDx3W2JdfGE+Pj4zMi13W2JdLGE9YStzfDAsdT1zLHM9bSxtPWw8PDEwfGw+Pj4yMixsPWssaz1hO2E9Y1sxXStoK218MDtjWzFdPWNbMl0raitzfDA7Y1syXT1jWzNdK3IrdXwwO2NbM109Y1s0XSt0K2t8MDtjWzRdPWNbMF0rZytsfDA7Y1swXT1hfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2RhdGEsZD1lLndvcmRzLGI9OCp0aGlzLl9uRGF0YUJ5dGVzLGM9OCplLnNpZ0J5dGVzO1xuZFtjPj4+NV18PTEyODw8MjQtYyUzMjtkWyhjKzY0Pj4+OTw8NCkrMTRdPShiPDw4fGI+Pj4yNCkmMTY3MTE5MzV8KGI8PDI0fGI+Pj44KSY0Mjc4MjU1MzYwO2Uuc2lnQnl0ZXM9NCooZC5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2U9dGhpcy5faGFzaDtkPWUud29yZHM7Zm9yKGI9MDs1PmI7YisrKWM9ZFtiXSxkW2JdPShjPDw4fGM+Pj4yNCkmMTY3MTE5MzV8KGM8PDI0fGM+Pj44KSY0Mjc4MjU1MzYwO3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBkPXAuY2xvbmUuY2FsbCh0aGlzKTtkLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gZH19KTtxLlJJUEVNRDE2MD1wLl9jcmVhdGVIZWxwZXIoZCk7cS5IbWFjUklQRU1EMTYwPXAuX2NyZWF0ZUhtYWNIZWxwZXIoZCl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBobWFjLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxrPWMuZW5jLlV0Zjg7Yy5hbGdvLkhNQUM9Yy5saWIuQmFzZS5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSxiKXthPXRoaXMuX2hhc2hlcj1uZXcgYS5pbml0O1wic3RyaW5nXCI9PXR5cGVvZiBiJiYoYj1rLnBhcnNlKGIpKTt2YXIgYz1hLmJsb2NrU2l6ZSxlPTQqYztiLnNpZ0J5dGVzPmUmJihiPWEuZmluYWxpemUoYikpO2IuY2xhbXAoKTtmb3IodmFyIGY9dGhpcy5fb0tleT1iLmNsb25lKCksZz10aGlzLl9pS2V5PWIuY2xvbmUoKSxoPWYud29yZHMsaj1nLndvcmRzLGQ9MDtkPGM7ZCsrKWhbZF1ePTE1NDk1NTY4MjgsaltkXV49OTA5NTIyNDg2O2Yuc2lnQnl0ZXM9Zy5zaWdCeXRlcz1lO3RoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9oYXNoZXI7YS5yZXNldCgpO2EudXBkYXRlKHRoaXMuX2lLZXkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dGhpcy5faGFzaGVyLnVwZGF0ZShhKTtyZXR1cm4gdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oYSl7dmFyIGI9XG50aGlzLl9oYXNoZXI7YT1iLmZpbmFsaXplKGEpO2IucmVzZXQoKTtyZXR1cm4gYi5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGEpKX19KX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcGJrZGYyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYj1DcnlwdG9KUyxhPWIubGliLGQ9YS5CYXNlLG09YS5Xb3JkQXJyYXksYT1iLmFsZ28scT1hLkhNQUMsbD1hLlBCS0RGMj1kLmV4dGVuZCh7Y2ZnOmQuZXh0ZW5kKHtrZXlTaXplOjQsaGFzaGVyOmEuU0hBMSxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKGEpe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChhKX0sY29tcHV0ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz10aGlzLmNmZyxmPXEuY3JlYXRlKGMuaGFzaGVyLGEpLGc9bS5jcmVhdGUoKSxkPW0uY3JlYXRlKFsxXSksbD1nLndvcmRzLHI9ZC53b3JkcyxuPWMua2V5U2l6ZSxjPWMuaXRlcmF0aW9ucztsLmxlbmd0aDxuOyl7dmFyIGg9Zi51cGRhdGUoYikuZmluYWxpemUoZCk7Zi5yZXNldCgpO2Zvcih2YXIgaj1oLndvcmRzLHM9ai5sZW5ndGgsaz1oLHA9MTtwPGM7cCsrKXtrPWYuZmluYWxpemUoayk7Zi5yZXNldCgpO2Zvcih2YXIgdD1rLndvcmRzLGU9MDtlPHM7ZSsrKWpbZV1ePXRbZV19Zy5jb25jYXQoaCk7XG5yWzBdKyt9Zy5zaWdCeXRlcz00Km47cmV0dXJuIGd9fSk7Yi5QQktERjI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBsLmNyZWF0ZShjKS5jb21wdXRlKGEsYil9fSkoKTtcblxuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBiNjRtYXA9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7dmFyIGI2NHBhZD1cIj1cIjtmdW5jdGlvbiBoZXgyYjY0KGQpe3ZhciBiO3ZhciBlO3ZhciBhPVwiXCI7Zm9yKGI9MDtiKzM8PWQubGVuZ3RoO2IrPTMpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzMpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU+PjYpK2I2NG1hcC5jaGFyQXQoZSY2Myl9aWYoYisxPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMSksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZTw8Mil9ZWxzZXtpZihiKzI9PWQubGVuZ3RoKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYisyKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj4yKStiNjRtYXAuY2hhckF0KChlJjMpPDw0KX19aWYoYjY0cGFkKXt3aGlsZSgoYS5sZW5ndGgmMyk+MCl7YSs9YjY0cGFkfX1yZXR1cm4gYX1mdW5jdGlvbiBiNjR0b2hleChmKXt2YXIgZD1cIlwiO3ZhciBlO3ZhciBiPTA7dmFyIGM7dmFyIGE7Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSl7aWYoZi5jaGFyQXQoZSk9PWI2NHBhZCl7YnJlYWt9YT1iNjRtYXAuaW5kZXhPZihmLmNoYXJBdChlKSk7aWYoYTwwKXtjb250aW51ZX1pZihiPT0wKXtkKz1pbnQyY2hhcihhPj4yKTtjPWEmMztiPTF9ZWxzZXtpZihiPT0xKXtkKz1pbnQyY2hhcigoYzw8Mil8KGE+PjQpKTtjPWEmMTU7Yj0yfWVsc2V7aWYoYj09Mil7ZCs9aW50MmNoYXIoYyk7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0zfWVsc2V7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7ZCs9aW50MmNoYXIoYSYxNSk7Yj0wfX19fWlmKGI9PTEpe2QrPWludDJjaGFyKGM8PDIpfXJldHVybiBkfWZ1bmN0aW9uIGI2NHRvQkEoZSl7dmFyIGQ9YjY0dG9oZXgoZSk7dmFyIGM7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKGM9MDsyKmM8ZC5sZW5ndGg7KytjKXtiW2NdPXBhcnNlSW50KGQuc3Vic3RyaW5nKDIqYywyKmMrMiksMTYpfXJldHVybiBifTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgZGJpdHM7dmFyIGNhbmFyeT0yNDQ4Mzc4MTQwOTQ1OTA7dmFyIGpfbG09KChjYW5hcnkmMTY3NzcyMTUpPT0xNTcxNTA3MCk7ZnVuY3Rpb24gQmlnSW50ZWdlcihlLGQsZil7aWYoZSE9bnVsbCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe3RoaXMuZnJvbU51bWJlcihlLGQsZil9ZWxzZXtpZihkPT1udWxsJiZcInN0cmluZ1wiIT10eXBlb2YgZSl7dGhpcy5mcm9tU3RyaW5nKGUsMjU2KX1lbHNle3RoaXMuZnJvbVN0cmluZyhlLGQpfX19fWZ1bmN0aW9uIG5iaSgpe3JldHVybiBuZXcgQmlnSW50ZWdlcihudWxsKX1mdW5jdGlvbiBhbTEoZixhLGIsZSxoLGcpe3doaWxlKC0tZz49MCl7dmFyIGQ9YSp0aGlzW2YrK10rYltlXStoO2g9TWF0aC5mbG9vcihkLzY3MTA4ODY0KTtiW2UrK109ZCY2NzEwODg2M31yZXR1cm4gaH1mdW5jdGlvbiBhbTIoZixxLHIsZSxvLGEpe3ZhciBrPXEmMzI3NjcscD1xPj4xNTt3aGlsZSgtLWE+PTApe3ZhciBkPXRoaXNbZl0mMzI3Njc7dmFyIGc9dGhpc1tmKytdPj4xNTt2YXIgYj1wKmQrZyprO2Q9aypkKygoYiYzMjc2Nyk8PDE1KStyW2VdKyhvJjEwNzM3NDE4MjMpO289KGQ+Pj4zMCkrKGI+Pj4xNSkrcCpnKyhvPj4+MzApO3JbZSsrXT1kJjEwNzM3NDE4MjN9cmV0dXJuIG99ZnVuY3Rpb24gYW0zKGYscSxyLGUsbyxhKXt2YXIgaz1xJjE2MzgzLHA9cT4+MTQ7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjE2MzgzO3ZhciBnPXRoaXNbZisrXT4+MTQ7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMTYzODMpPDwxNCkrcltlXStvO289KGQ+PjI4KSsoYj4+MTQpK3AqZztyW2UrK109ZCYyNjg0MzU0NTV9cmV0dXJuIG99aWYoal9sbSYmKG5hdmlnYXRvci5hcHBOYW1lPT1cIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0yO2RiaXRzPTMwfWVsc2V7aWYoal9sbSYmKG5hdmlnYXRvci5hcHBOYW1lIT1cIk5ldHNjYXBlXCIpKXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTE7ZGJpdHM9MjZ9ZWxzZXtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbT1hbTM7ZGJpdHM9Mjh9fUJpZ0ludGVnZXIucHJvdG90eXBlLkRCPWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkRNPSgoMTw8ZGJpdHMpLTEpO0JpZ0ludGVnZXIucHJvdG90eXBlLkRWPSgxPDxkYml0cyk7dmFyIEJJX0ZQPTUyO0JpZ0ludGVnZXIucHJvdG90eXBlLkZWPU1hdGgucG93KDIsQklfRlApO0JpZ0ludGVnZXIucHJvdG90eXBlLkYxPUJJX0ZQLWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkYyPTIqZGJpdHMtQklfRlA7dmFyIEJJX1JNPVwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7dmFyIEJJX1JDPW5ldyBBcnJheSgpO3ZhciBycix2djtycj1cIjBcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0wO3Z2PD05OysrdnYpe0JJX1JDW3JyKytdPXZ2fXJyPVwiYVwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpe0JJX1JDW3JyKytdPXZ2fXJyPVwiQVwiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpe0JJX1JDW3JyKytdPXZ2fWZ1bmN0aW9uIGludDJjaGFyKGEpe3JldHVybiBCSV9STS5jaGFyQXQoYSl9ZnVuY3Rpb24gaW50QXQoYixhKXt2YXIgZD1CSV9SQ1tiLmNoYXJDb2RlQXQoYSldO3JldHVybihkPT1udWxsKT8tMTpkfWZ1bmN0aW9uIGJucENvcHlUbyhiKXtmb3IodmFyIGE9dGhpcy50LTE7YT49MDstLWEpe2JbYV09dGhpc1thXX1iLnQ9dGhpcy50O2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRnJvbUludChhKXt0aGlzLnQ9MTt0aGlzLnM9KGE8MCk/LTE6MDtpZihhPjApe3RoaXNbMF09YX1lbHNle2lmKGE8LTEpe3RoaXNbMF09YSt0aGlzLkRWfWVsc2V7dGhpcy50PTB9fX1mdW5jdGlvbiBuYnYoYSl7dmFyIGI9bmJpKCk7Yi5mcm9tSW50KGEpO3JldHVybiBifWZ1bmN0aW9uIGJucEZyb21TdHJpbmcoaCxjKXt2YXIgZTtpZihjPT0xNil7ZT00fWVsc2V7aWYoYz09OCl7ZT0zfWVsc2V7aWYoYz09MjU2KXtlPTh9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7dGhpcy5mcm9tUmFkaXgoaCxjKTtyZXR1cm59fX19fX10aGlzLnQ9MDt0aGlzLnM9MDt2YXIgZz1oLmxlbmd0aCxkPWZhbHNlLGY9MDt3aGlsZSgtLWc+PTApe3ZhciBhPShlPT04KT9oW2ddJjI1NTppbnRBdChoLGcpO2lmKGE8MCl7aWYoaC5jaGFyQXQoZyk9PVwiLVwiKXtkPXRydWV9Y29udGludWV9ZD1mYWxzZTtpZihmPT0wKXt0aGlzW3RoaXMudCsrXT1hfWVsc2V7aWYoZitlPnRoaXMuREIpe3RoaXNbdGhpcy50LTFdfD0oYSYoKDE8PCh0aGlzLkRCLWYpKS0xKSk8PGY7dGhpc1t0aGlzLnQrK109KGE+Pih0aGlzLkRCLWYpKX1lbHNle3RoaXNbdGhpcy50LTFdfD1hPDxmfX1mKz1lO2lmKGY+PXRoaXMuREIpe2YtPXRoaXMuREJ9fWlmKGU9PTgmJihoWzBdJjEyOCkhPTApe3RoaXMucz0tMTtpZihmPjApe3RoaXNbdGhpcy50LTFdfD0oKDE8PCh0aGlzLkRCLWYpKS0xKTw8Zn19dGhpcy5jbGFtcCgpO2lmKGQpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibnBDbGFtcCgpe3ZhciBhPXRoaXMucyZ0aGlzLkRNO3doaWxlKHRoaXMudD4wJiZ0aGlzW3RoaXMudC0xXT09YSl7LS10aGlzLnR9fWZ1bmN0aW9uIGJuVG9TdHJpbmcoYyl7aWYodGhpcy5zPDApe3JldHVyblwiLVwiK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYyl9dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTIpe2U9MX1lbHNle2lmKGM9PTMyKXtlPTV9ZWxzZXtpZihjPT00KXtlPTJ9ZWxzZXtyZXR1cm4gdGhpcy50b1JhZGl4KGMpfX19fX12YXIgZz0oMTw8ZSktMSxsLGE9ZmFsc2UsaD1cIlwiLGY9dGhpcy50O3ZhciBqPXRoaXMuREItKGYqdGhpcy5EQiklZTtpZihmLS0+MCl7aWYoajx0aGlzLkRCJiYobD10aGlzW2ZdPj5qKT4wKXthPXRydWU7aD1pbnQyY2hhcihsKX13aGlsZShmPj0wKXtpZihqPGUpe2w9KHRoaXNbZl0mKCgxPDxqKS0xKSk8PChlLWopO2x8PXRoaXNbLS1mXT4+KGorPXRoaXMuREItZSl9ZWxzZXtsPSh0aGlzW2ZdPj4oai09ZSkpJmc7aWYoajw9MCl7ais9dGhpcy5EQjstLWZ9fWlmKGw+MCl7YT10cnVlfWlmKGEpe2grPWludDJjaGFyKGwpfX19cmV0dXJuIGE/aDpcIjBcIn1mdW5jdGlvbiBibk5lZ2F0ZSgpe3ZhciBhPW5iaSgpO0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuQWJzKCl7cmV0dXJuKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXN9ZnVuY3Rpb24gYm5Db21wYXJlVG8oYil7dmFyIGQ9dGhpcy5zLWIucztpZihkIT0wKXtyZXR1cm4gZH12YXIgYz10aGlzLnQ7ZD1jLWIudDtpZihkIT0wKXtyZXR1cm4odGhpcy5zPDApPy1kOmR9d2hpbGUoLS1jPj0wKXtpZigoZD10aGlzW2NdLWJbY10pIT0wKXtyZXR1cm4gZH19cmV0dXJuIDB9ZnVuY3Rpb24gbmJpdHMoYSl7dmFyIGM9MSxiO2lmKChiPWE+Pj4xNikhPTApe2E9YjtjKz0xNn1pZigoYj1hPj44KSE9MCl7YT1iO2MrPTh9aWYoKGI9YT4+NCkhPTApe2E9YjtjKz00fWlmKChiPWE+PjIpIT0wKXthPWI7Yys9Mn1pZigoYj1hPj4xKSE9MCl7YT1iO2MrPTF9cmV0dXJuIGN9ZnVuY3Rpb24gYm5CaXRMZW5ndGgoKXtpZih0aGlzLnQ8PTApe3JldHVybiAwfXJldHVybiB0aGlzLkRCKih0aGlzLnQtMSkrbmJpdHModGhpc1t0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSl9ZnVuY3Rpb24gYm5wRExTaGlmdFRvKGMsYil7dmFyIGE7Zm9yKGE9dGhpcy50LTE7YT49MDstLWEpe2JbYStjXT10aGlzW2FdfWZvcihhPWMtMTthPj0wOy0tYSl7YlthXT0wfWIudD10aGlzLnQrYztiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucERSU2hpZnRUbyhjLGIpe2Zvcih2YXIgYT1jO2E8dGhpcy50OysrYSl7YlthLWNdPXRoaXNbYV19Yi50PU1hdGgubWF4KHRoaXMudC1jLDApO2Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wTFNoaWZ0VG8oaixlKXt2YXIgYj1qJXRoaXMuREI7dmFyIGE9dGhpcy5EQi1iO3ZhciBnPSgxPDxhKS0xO3ZhciBmPU1hdGguZmxvb3Ioai90aGlzLkRCKSxoPSh0aGlzLnM8PGIpJnRoaXMuRE0sZDtmb3IoZD10aGlzLnQtMTtkPj0wOy0tZCl7ZVtkK2YrMV09KHRoaXNbZF0+PmEpfGg7aD0odGhpc1tkXSZnKTw8Yn1mb3IoZD1mLTE7ZD49MDstLWQpe2VbZF09MH1lW2ZdPWg7ZS50PXRoaXMudCtmKzE7ZS5zPXRoaXMucztlLmNsYW1wKCl9ZnVuY3Rpb24gYm5wUlNoaWZ0VG8oZyxkKXtkLnM9dGhpcy5zO3ZhciBlPU1hdGguZmxvb3IoZy90aGlzLkRCKTtpZihlPj10aGlzLnQpe2QudD0wO3JldHVybn12YXIgYj1nJXRoaXMuREI7dmFyIGE9dGhpcy5EQi1iO3ZhciBmPSgxPDxiKS0xO2RbMF09dGhpc1tlXT4+Yjtmb3IodmFyIGM9ZSsxO2M8dGhpcy50OysrYyl7ZFtjLWUtMV18PSh0aGlzW2NdJmYpPDxhO2RbYy1lXT10aGlzW2NdPj5ifWlmKGI+MCl7ZFt0aGlzLnQtZS0xXXw9KHRoaXMucyZmKTw8YX1kLnQ9dGhpcy50LWU7ZC5jbGFtcCgpfWZ1bmN0aW9uIGJucFN1YlRvKGQsZil7dmFyIGU9MCxnPTAsYj1NYXRoLm1pbihkLnQsdGhpcy50KTt3aGlsZShlPGIpe2crPXRoaXNbZV0tZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWlmKGQudDx0aGlzLnQpe2ctPWQuczt3aGlsZShlPHRoaXMudCl7Zys9dGhpc1tlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPXRoaXMuc31lbHNle2crPXRoaXMuczt3aGlsZShlPGQudCl7Zy09ZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWctPWQuc31mLnM9KGc8MCk/LTE6MDtpZihnPC0xKXtmW2UrK109dGhpcy5EVitnfWVsc2V7aWYoZz4wKXtmW2UrK109Z319Zi50PWU7Zi5jbGFtcCgpfWZ1bmN0aW9uIGJucE11bHRpcGx5VG8oYyxlKXt2YXIgYj10aGlzLmFicygpLGY9Yy5hYnMoKTt2YXIgZD1iLnQ7ZS50PWQrZi50O3doaWxlKC0tZD49MCl7ZVtkXT0wfWZvcihkPTA7ZDxmLnQ7KytkKXtlW2QrYi50XT1iLmFtKDAsZltkXSxlLGQsMCxiLnQpfWUucz0wO2UuY2xhbXAoKTtpZih0aGlzLnMhPWMucyl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGUsZSl9fWZ1bmN0aW9uIGJucFNxdWFyZVRvKGQpe3ZhciBhPXRoaXMuYWJzKCk7dmFyIGI9ZC50PTIqYS50O3doaWxlKC0tYj49MCl7ZFtiXT0wfWZvcihiPTA7YjxhLnQtMTsrK2Ipe3ZhciBlPWEuYW0oYixhW2JdLGQsMipiLDAsMSk7aWYoKGRbYithLnRdKz1hLmFtKGIrMSwyKmFbYl0sZCwyKmIrMSxlLGEudC1iLTEpKT49YS5EVil7ZFtiK2EudF0tPWEuRFY7ZFtiK2EudCsxXT0xfX1pZihkLnQ+MCl7ZFtkLnQtMV0rPWEuYW0oYixhW2JdLGQsMipiLDAsMSl9ZC5zPTA7ZC5jbGFtcCgpfWZ1bmN0aW9uIGJucERpdlJlbVRvKG4saCxnKXt2YXIgdz1uLmFicygpO2lmKHcudDw9MCl7cmV0dXJufXZhciBrPXRoaXMuYWJzKCk7aWYoay50PHcudCl7aWYoaCE9bnVsbCl7aC5mcm9tSW50KDApfWlmKGchPW51bGwpe3RoaXMuY29weVRvKGcpfXJldHVybn1pZihnPT1udWxsKXtnPW5iaSgpfXZhciBkPW5iaSgpLGE9dGhpcy5zLGw9bi5zO3ZhciB2PXRoaXMuREItbmJpdHMod1t3LnQtMV0pO2lmKHY+MCl7dy5sU2hpZnRUbyh2LGQpO2subFNoaWZ0VG8odixnKX1lbHNle3cuY29weVRvKGQpO2suY29weVRvKGcpfXZhciBwPWQudDt2YXIgYj1kW3AtMV07aWYoYj09MCl7cmV0dXJufXZhciBvPWIqKDE8PHRoaXMuRjEpKygocD4xKT9kW3AtMl0+PnRoaXMuRjI6MCk7dmFyIEE9dGhpcy5GVi9vLHo9KDE8PHRoaXMuRjEpL28seD0xPDx0aGlzLkYyO3ZhciB1PWcudCxzPXUtcCxmPShoPT1udWxsKT9uYmkoKTpoO2QuZGxTaGlmdFRvKHMsZik7aWYoZy5jb21wYXJlVG8oZik+PTApe2dbZy50KytdPTE7Zy5zdWJUbyhmLGcpfUJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbyhwLGYpO2Yuc3ViVG8oZCxkKTt3aGlsZShkLnQ8cCl7ZFtkLnQrK109MH13aGlsZSgtLXM+PTApe3ZhciBjPShnWy0tdV09PWIpP3RoaXMuRE06TWF0aC5mbG9vcihnW3VdKkErKGdbdS0xXSt4KSp6KTtpZigoZ1t1XSs9ZC5hbSgwLGMsZyxzLDAscCkpPGMpe2QuZGxTaGlmdFRvKHMsZik7Zy5zdWJUbyhmLGcpO3doaWxlKGdbdV08LS1jKXtnLnN1YlRvKGYsZyl9fX1pZihoIT1udWxsKXtnLmRyU2hpZnRUbyhwLGgpO2lmKGEhPWwpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhoLGgpfX1nLnQ9cDtnLmNsYW1wKCk7aWYodj4wKXtnLnJTaGlmdFRvKHYsZyl9aWYoYTwwKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oZyxnKX19ZnVuY3Rpb24gYm5Nb2QoYil7dmFyIGM9bmJpKCk7dGhpcy5hYnMoKS5kaXZSZW1UbyhiLG51bGwsYyk7aWYodGhpcy5zPDAmJmMuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk+MCl7Yi5zdWJUbyhjLGMpfXJldHVybiBjfWZ1bmN0aW9uIENsYXNzaWMoYSl7dGhpcy5tPWF9ZnVuY3Rpb24gY0NvbnZlcnQoYSl7aWYoYS5zPDB8fGEuY29tcGFyZVRvKHRoaXMubSk+PTApe3JldHVybiBhLm1vZCh0aGlzLm0pfWVsc2V7cmV0dXJuIGF9fWZ1bmN0aW9uIGNSZXZlcnQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gY1JlZHVjZShhKXthLmRpdlJlbVRvKHRoaXMubSxudWxsLGEpfWZ1bmN0aW9uIGNNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gY1NxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1DbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0PWNDb252ZXJ0O0NsYXNzaWMucHJvdG90eXBlLnJldmVydD1jUmV2ZXJ0O0NsYXNzaWMucHJvdG90eXBlLnJlZHVjZT1jUmVkdWNlO0NsYXNzaWMucHJvdG90eXBlLm11bFRvPWNNdWxUbztDbGFzc2ljLnByb3RvdHlwZS5zcXJUbz1jU3FyVG87ZnVuY3Rpb24gYm5wSW52RGlnaXQoKXtpZih0aGlzLnQ8MSl7cmV0dXJuIDB9dmFyIGE9dGhpc1swXTtpZigoYSYxKT09MCl7cmV0dXJuIDB9dmFyIGI9YSYzO2I9KGIqKDItKGEmMTUpKmIpKSYxNTtiPShiKigyLShhJjI1NSkqYikpJjI1NTtiPShiKigyLSgoKGEmNjU1MzUpKmIpJjY1NTM1KSkpJjY1NTM1O2I9KGIqKDItYSpiJXRoaXMuRFYpKSV0aGlzLkRWO3JldHVybihiPjApP3RoaXMuRFYtYjotYn1mdW5jdGlvbiBNb250Z29tZXJ5KGEpe3RoaXMubT1hO3RoaXMubXA9YS5pbnZEaWdpdCgpO3RoaXMubXBsPXRoaXMubXAmMzI3Njc7dGhpcy5tcGg9dGhpcy5tcD4+MTU7dGhpcy51bT0oMTw8KGEuREItMTUpKS0xO3RoaXMubXQyPTIqYS50fWZ1bmN0aW9uIG1vbnRDb252ZXJ0KGEpe3ZhciBiPW5iaSgpO2EuYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LGIpO2IuZGl2UmVtVG8odGhpcy5tLG51bGwsYik7aWYoYS5zPDAmJmIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk+MCl7dGhpcy5tLnN1YlRvKGIsYil9cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJldmVydChhKXt2YXIgYj1uYmkoKTthLmNvcHlUbyhiKTt0aGlzLnJlZHVjZShiKTtyZXR1cm4gYn1mdW5jdGlvbiBtb250UmVkdWNlKGEpe3doaWxlKGEudDw9dGhpcy5tdDIpe2FbYS50KytdPTB9Zm9yKHZhciBjPTA7Yzx0aGlzLm0udDsrK2Mpe3ZhciBiPWFbY10mMzI3Njc7dmFyIGQ9KGIqdGhpcy5tcGwrKCgoYip0aGlzLm1waCsoYVtjXT4+MTUpKnRoaXMubXBsKSZ0aGlzLnVtKTw8MTUpKSZhLkRNO2I9Yyt0aGlzLm0udDthW2JdKz10aGlzLm0uYW0oMCxkLGEsYywwLHRoaXMubS50KTt3aGlsZShhW2JdPj1hLkRWKXthW2JdLT1hLkRWO2FbKytiXSsrfX1hLmNsYW1wKCk7YS5kclNoaWZ0VG8odGhpcy5tLnQsYSk7aWYoYS5jb21wYXJlVG8odGhpcy5tKT49MCl7YS5zdWJUbyh0aGlzLm0sYSl9fWZ1bmN0aW9uIG1vbnRTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gbW9udE11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1Nb250Z29tZXJ5LnByb3RvdHlwZS5jb252ZXJ0PW1vbnRDb252ZXJ0O01vbnRnb21lcnkucHJvdG90eXBlLnJldmVydD1tb250UmV2ZXJ0O01vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZT1tb250UmVkdWNlO01vbnRnb21lcnkucHJvdG90eXBlLm11bFRvPW1vbnRNdWxUbztNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbz1tb250U3FyVG87ZnVuY3Rpb24gYm5wSXNFdmVuKCl7cmV0dXJuKCh0aGlzLnQ+MCk/KHRoaXNbMF0mMSk6dGhpcy5zKT09MH1mdW5jdGlvbiBibnBFeHAoaCxqKXtpZihoPjQyOTQ5NjcyOTV8fGg8MSl7cmV0dXJuIEJpZ0ludGVnZXIuT05FfXZhciBmPW5iaSgpLGE9bmJpKCksZD1qLmNvbnZlcnQodGhpcyksYz1uYml0cyhoKS0xO2QuY29weVRvKGYpO3doaWxlKC0tYz49MCl7ai5zcXJUbyhmLGEpO2lmKChoJigxPDxjKSk+MCl7ai5tdWxUbyhhLGQsZil9ZWxzZXt2YXIgYj1mO2Y9YTthPWJ9fXJldHVybiBqLnJldmVydChmKX1mdW5jdGlvbiBibk1vZFBvd0ludChiLGEpe3ZhciBjO2lmKGI8MjU2fHxhLmlzRXZlbigpKXtjPW5ldyBDbGFzc2ljKGEpfWVsc2V7Yz1uZXcgTW9udGdvbWVyeShhKX1yZXR1cm4gdGhpcy5leHAoYixjKX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG89Ym5wQ29weVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQ9Ym5wRnJvbUludDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tU3RyaW5nPWJucEZyb21TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXA9Ym5wQ2xhbXA7QmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvPWJucERMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kclNoaWZ0VG89Ym5wRFJTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmxTaGlmdFRvPWJucExTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvPWJucFJTaGlmdFRvO0JpZ0ludGVnZXIucHJvdG90eXBlLnN1YlRvPWJucFN1YlRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VG89Ym5wTXVsdGlwbHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbz1ibnBTcXVhcmVUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZSZW1Ubz1ibnBEaXZSZW1UbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnZEaWdpdD1ibnBJbnZEaWdpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW49Ym5wSXNFdmVuO0JpZ0ludGVnZXIucHJvdG90eXBlLmV4cD1ibnBFeHA7QmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmc9Ym5Ub1N0cmluZztCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdhdGU9Ym5OZWdhdGU7QmlnSW50ZWdlci5wcm90b3R5cGUuYWJzPWJuQWJzO0JpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbz1ibkNvbXBhcmVUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGg9Ym5CaXRMZW5ndGg7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kPWJuTW9kO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludD1ibk1vZFBvd0ludDtCaWdJbnRlZ2VyLlpFUk89bmJ2KDApO0JpZ0ludGVnZXIuT05FPW5idigxKTtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBibkNsb25lKCl7dmFyIGE9bmJpKCk7dGhpcy5jb3B5VG8oYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5JbnRWYWx1ZSgpe2lmKHRoaXMuczwwKXtpZih0aGlzLnQ9PTEpe3JldHVybiB0aGlzWzBdLXRoaXMuRFZ9ZWxzZXtpZih0aGlzLnQ9PTApe3JldHVybiAtMX19fWVsc2V7aWYodGhpcy50PT0xKXtyZXR1cm4gdGhpc1swXX1lbHNle2lmKHRoaXMudD09MCl7cmV0dXJuIDB9fX1yZXR1cm4oKHRoaXNbMV0mKCgxPDwoMzItdGhpcy5EQikpLTEpKTw8dGhpcy5EQil8dGhpc1swXX1mdW5jdGlvbiBibkJ5dGVWYWx1ZSgpe3JldHVybih0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MjQpPj4yNH1mdW5jdGlvbiBiblNob3J0VmFsdWUoKXtyZXR1cm4odGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDE2KT4+MTZ9ZnVuY3Rpb24gYm5wQ2h1bmtTaXplKGEpe3JldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2coYSkpfWZ1bmN0aW9uIGJuU2lnTnVtKCl7aWYodGhpcy5zPDApe3JldHVybiAtMX1lbHNle2lmKHRoaXMudDw9MHx8KHRoaXMudD09MSYmdGhpc1swXTw9MCkpe3JldHVybiAwfWVsc2V7cmV0dXJuIDF9fX1mdW5jdGlvbiBibnBUb1JhZGl4KGMpe2lmKGM9PW51bGwpe2M9MTB9aWYodGhpcy5zaWdudW0oKT09MHx8YzwyfHxjPjM2KXtyZXR1cm5cIjBcIn12YXIgZj10aGlzLmNodW5rU2l6ZShjKTt2YXIgZT1NYXRoLnBvdyhjLGYpO3ZhciBpPW5idihlKSxqPW5iaSgpLGg9bmJpKCksZz1cIlwiO3RoaXMuZGl2UmVtVG8oaSxqLGgpO3doaWxlKGouc2lnbnVtKCk+MCl7Zz0oZStoLmludFZhbHVlKCkpLnRvU3RyaW5nKGMpLnN1YnN0cigxKStnO2ouZGl2UmVtVG8oaSxqLGgpfXJldHVybiBoLmludFZhbHVlKCkudG9TdHJpbmcoYykrZ31mdW5jdGlvbiBibnBGcm9tUmFkaXgobSxoKXt0aGlzLmZyb21JbnQoMCk7aWYoaD09bnVsbCl7aD0xMH12YXIgZj10aGlzLmNodW5rU2l6ZShoKTt2YXIgZz1NYXRoLnBvdyhoLGYpLGU9ZmFsc2UsYT0wLGw9MDtmb3IodmFyIGM9MDtjPG0ubGVuZ3RoOysrYyl7dmFyIGs9aW50QXQobSxjKTtpZihrPDApe2lmKG0uY2hhckF0KGMpPT1cIi1cIiYmdGhpcy5zaWdudW0oKT09MCl7ZT10cnVlfWNvbnRpbnVlfWw9aCpsK2s7aWYoKythPj1mKXt0aGlzLmRNdWx0aXBseShnKTt0aGlzLmRBZGRPZmZzZXQobCwwKTthPTA7bD0wfX1pZihhPjApe3RoaXMuZE11bHRpcGx5KE1hdGgucG93KGgsYSkpO3RoaXMuZEFkZE9mZnNldChsLDApfWlmKGUpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibnBGcm9tTnVtYmVyKGYsZSxoKXtpZihcIm51bWJlclwiPT10eXBlb2YgZSl7aWYoZjwyKXt0aGlzLmZyb21JbnQoMSl9ZWxzZXt0aGlzLmZyb21OdW1iZXIoZixoKTtpZighdGhpcy50ZXN0Qml0KGYtMSkpe3RoaXMuYml0d2lzZVRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChmLTEpLG9wX29yLHRoaXMpfWlmKHRoaXMuaXNFdmVuKCkpe3RoaXMuZEFkZE9mZnNldCgxLDApfXdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShlKSl7dGhpcy5kQWRkT2Zmc2V0KDIsMCk7aWYodGhpcy5iaXRMZW5ndGgoKT5mKXt0aGlzLnN1YlRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChmLTEpLHRoaXMpfX19fWVsc2V7dmFyIGQ9bmV3IEFycmF5KCksZz1mJjc7ZC5sZW5ndGg9KGY+PjMpKzE7ZS5uZXh0Qnl0ZXMoZCk7aWYoZz4wKXtkWzBdJj0oKDE8PGcpLTEpfWVsc2V7ZFswXT0wfXRoaXMuZnJvbVN0cmluZyhkLDI1Nil9fWZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKXt2YXIgYj10aGlzLnQsYz1uZXcgQXJyYXkoKTtjWzBdPXRoaXMuczt2YXIgZT10aGlzLkRCLShiKnRoaXMuREIpJTgsZixhPTA7aWYoYi0tPjApe2lmKGU8dGhpcy5EQiYmKGY9dGhpc1tiXT4+ZSkhPSh0aGlzLnMmdGhpcy5ETSk+PmUpe2NbYSsrXT1mfCh0aGlzLnM8PCh0aGlzLkRCLWUpKX13aGlsZShiPj0wKXtpZihlPDgpe2Y9KHRoaXNbYl0mKCgxPDxlKS0xKSk8PCg4LWUpO2Z8PXRoaXNbLS1iXT4+KGUrPXRoaXMuREItOCl9ZWxzZXtmPSh0aGlzW2JdPj4oZS09OCkpJjI1NTtpZihlPD0wKXtlKz10aGlzLkRCOy0tYn19aWYoKGYmMTI4KSE9MCl7Znw9LTI1Nn1pZihhPT0wJiYodGhpcy5zJjEyOCkhPShmJjEyOCkpeysrYX1pZihhPjB8fGYhPXRoaXMucyl7Y1thKytdPWZ9fX1yZXR1cm4gY31mdW5jdGlvbiBibkVxdWFscyhiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik9PTApfWZ1bmN0aW9uIGJuTWluKGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKTwwKT90aGlzOmJ9ZnVuY3Rpb24gYm5NYXgoYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPjApP3RoaXM6Yn1mdW5jdGlvbiBibnBCaXR3aXNlVG8oYyxoLGUpe3ZhciBkLGcsYj1NYXRoLm1pbihjLnQsdGhpcy50KTtmb3IoZD0wO2Q8YjsrK2Qpe2VbZF09aCh0aGlzW2RdLGNbZF0pfWlmKGMudDx0aGlzLnQpe2c9Yy5zJnRoaXMuRE07Zm9yKGQ9YjtkPHRoaXMudDsrK2Qpe2VbZF09aCh0aGlzW2RdLGcpfWUudD10aGlzLnR9ZWxzZXtnPXRoaXMucyZ0aGlzLkRNO2ZvcihkPWI7ZDxjLnQ7KytkKXtlW2RdPWgoZyxjW2RdKX1lLnQ9Yy50fWUucz1oKHRoaXMucyxjLnMpO2UuY2xhbXAoKX1mdW5jdGlvbiBvcF9hbmQoYSxiKXtyZXR1cm4gYSZifWZ1bmN0aW9uIGJuQW5kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3BfYW5kLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX29yKGEsYil7cmV0dXJuIGF8Yn1mdW5jdGlvbiBibk9yKGIpe3ZhciBjPW5iaSgpO3RoaXMuYml0d2lzZVRvKGIsb3Bfb3IsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3BfeG9yKGEsYil7cmV0dXJuIGFeYn1mdW5jdGlvbiBiblhvcihiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX3hvcixjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF9hbmRub3QoYSxiKXtyZXR1cm4gYSZ+Yn1mdW5jdGlvbiBibkFuZE5vdChiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX2FuZG5vdCxjKTtyZXR1cm4gY31mdW5jdGlvbiBibk5vdCgpe3ZhciBiPW5iaSgpO2Zvcih2YXIgYT0wO2E8dGhpcy50OysrYSl7YlthXT10aGlzLkRNJn50aGlzW2FdfWIudD10aGlzLnQ7Yi5zPX50aGlzLnM7cmV0dXJuIGJ9ZnVuY3Rpb24gYm5TaGlmdExlZnQoYil7dmFyIGE9bmJpKCk7aWYoYjwwKXt0aGlzLnJTaGlmdFRvKC1iLGEpfWVsc2V7dGhpcy5sU2hpZnRUbyhiLGEpfXJldHVybiBhfWZ1bmN0aW9uIGJuU2hpZnRSaWdodChiKXt2YXIgYT1uYmkoKTtpZihiPDApe3RoaXMubFNoaWZ0VG8oLWIsYSl9ZWxzZXt0aGlzLnJTaGlmdFRvKGIsYSl9cmV0dXJuIGF9ZnVuY3Rpb24gbGJpdChhKXtpZihhPT0wKXtyZXR1cm4gLTF9dmFyIGI9MDtpZigoYSY2NTUzNSk9PTApe2E+Pj0xNjtiKz0xNn1pZigoYSYyNTUpPT0wKXthPj49ODtiKz04fWlmKChhJjE1KT09MCl7YT4+PTQ7Yis9NH1pZigoYSYzKT09MCl7YT4+PTI7Yis9Mn1pZigoYSYxKT09MCl7KytifXJldHVybiBifWZ1bmN0aW9uIGJuR2V0TG93ZXN0U2V0Qml0KCl7Zm9yKHZhciBhPTA7YTx0aGlzLnQ7KythKXtpZih0aGlzW2FdIT0wKXtyZXR1cm4gYSp0aGlzLkRCK2xiaXQodGhpc1thXSl9fWlmKHRoaXMuczwwKXtyZXR1cm4gdGhpcy50KnRoaXMuREJ9cmV0dXJuIC0xfWZ1bmN0aW9uIGNiaXQoYSl7dmFyIGI9MDt3aGlsZShhIT0wKXthJj1hLTE7KytifXJldHVybiBifWZ1bmN0aW9uIGJuQml0Q291bnQoKXt2YXIgYz0wLGE9dGhpcy5zJnRoaXMuRE07Zm9yKHZhciBiPTA7Yjx0aGlzLnQ7KytiKXtjKz1jYml0KHRoaXNbYl1eYSl9cmV0dXJuIGN9ZnVuY3Rpb24gYm5UZXN0Qml0KGIpe3ZhciBhPU1hdGguZmxvb3IoYi90aGlzLkRCKTtpZihhPj10aGlzLnQpe3JldHVybih0aGlzLnMhPTApfXJldHVybigodGhpc1thXSYoMTw8KGIldGhpcy5EQikpKSE9MCl9ZnVuY3Rpb24gYm5wQ2hhbmdlQml0KGMsYil7dmFyIGE9QmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGMpO3RoaXMuYml0d2lzZVRvKGEsYixhKTtyZXR1cm4gYX1mdW5jdGlvbiBiblNldEJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF9vcil9ZnVuY3Rpb24gYm5DbGVhckJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF9hbmRub3QpfWZ1bmN0aW9uIGJuRmxpcEJpdChhKXtyZXR1cm4gdGhpcy5jaGFuZ2VCaXQoYSxvcF94b3IpfWZ1bmN0aW9uIGJucEFkZFRvKGQsZil7dmFyIGU9MCxnPTAsYj1NYXRoLm1pbihkLnQsdGhpcy50KTt3aGlsZShlPGIpe2crPXRoaXNbZV0rZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWlmKGQudDx0aGlzLnQpe2crPWQuczt3aGlsZShlPHRoaXMudCl7Zys9dGhpc1tlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPXRoaXMuc31lbHNle2crPXRoaXMuczt3aGlsZShlPGQudCl7Zys9ZFtlXTtmW2UrK109ZyZ0aGlzLkRNO2c+Pj10aGlzLkRCfWcrPWQuc31mLnM9KGc8MCk/LTE6MDtpZihnPjApe2ZbZSsrXT1nfWVsc2V7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ319Zi50PWU7Zi5jbGFtcCgpfWZ1bmN0aW9uIGJuQWRkKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWRkVG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBiblN1YnRyYWN0KGIpe3ZhciBjPW5iaSgpO3RoaXMuc3ViVG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBibk11bHRpcGx5KGIpe3ZhciBjPW5iaSgpO3RoaXMubXVsdGlwbHlUbyhiLGMpO3JldHVybiBjfWZ1bmN0aW9uIGJuU3F1YXJlKCl7dmFyIGE9bmJpKCk7dGhpcy5zcXVhcmVUbyhhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkRpdmlkZShiKXt2YXIgYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsYyxudWxsKTtyZXR1cm4gY31mdW5jdGlvbiBiblJlbWFpbmRlcihiKXt2YXIgYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsbnVsbCxjKTtyZXR1cm4gY31mdW5jdGlvbiBibkRpdmlkZUFuZFJlbWFpbmRlcihiKXt2YXIgZD1uYmkoKSxjPW5iaSgpO3RoaXMuZGl2UmVtVG8oYixkLGMpO3JldHVybiBuZXcgQXJyYXkoZCxjKX1mdW5jdGlvbiBibnBETXVsdGlwbHkoYSl7dGhpc1t0aGlzLnRdPXRoaXMuYW0oMCxhLTEsdGhpcywwLDAsdGhpcy50KTsrK3RoaXMudDt0aGlzLmNsYW1wKCl9ZnVuY3Rpb24gYm5wREFkZE9mZnNldChiLGEpe2lmKGI9PTApe3JldHVybn13aGlsZSh0aGlzLnQ8PWEpe3RoaXNbdGhpcy50KytdPTB9dGhpc1thXSs9Yjt3aGlsZSh0aGlzW2FdPj10aGlzLkRWKXt0aGlzW2FdLT10aGlzLkRWO2lmKCsrYT49dGhpcy50KXt0aGlzW3RoaXMudCsrXT0wfSsrdGhpc1thXX19ZnVuY3Rpb24gTnVsbEV4cCgpe31mdW5jdGlvbiBuTm9wKGEpe3JldHVybiBhfWZ1bmN0aW9uIG5NdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYil9ZnVuY3Rpb24gblNxclRvKGEsYil7YS5zcXVhcmVUbyhiKX1OdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0PW5Ob3A7TnVsbEV4cC5wcm90b3R5cGUucmV2ZXJ0PW5Ob3A7TnVsbEV4cC5wcm90b3R5cGUubXVsVG89bk11bFRvO051bGxFeHAucHJvdG90eXBlLnNxclRvPW5TcXJUbztmdW5jdGlvbiBiblBvdyhhKXtyZXR1cm4gdGhpcy5leHAoYSxuZXcgTnVsbEV4cCgpKX1mdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYixmLGUpe3ZhciBkPU1hdGgubWluKHRoaXMudCtiLnQsZik7ZS5zPTA7ZS50PWQ7d2hpbGUoZD4wKXtlWy0tZF09MH12YXIgYztmb3IoYz1lLnQtdGhpcy50O2Q8YzsrK2Qpe2VbZCt0aGlzLnRdPXRoaXMuYW0oMCxiW2RdLGUsZCwwLHRoaXMudCl9Zm9yKGM9TWF0aC5taW4oYi50LGYpO2Q8YzsrK2Qpe3RoaXMuYW0oMCxiW2RdLGUsZCwwLGYtZCl9ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucE11bHRpcGx5VXBwZXJUbyhiLGUsZCl7LS1lO3ZhciBjPWQudD10aGlzLnQrYi50LWU7ZC5zPTA7d2hpbGUoLS1jPj0wKXtkW2NdPTB9Zm9yKGM9TWF0aC5tYXgoZS10aGlzLnQsMCk7YzxiLnQ7KytjKXtkW3RoaXMudCtjLWVdPXRoaXMuYW0oZS1jLGJbY10sZCwwLDAsdGhpcy50K2MtZSl9ZC5jbGFtcCgpO2QuZHJTaGlmdFRvKDEsZCl9ZnVuY3Rpb24gQmFycmV0dChhKXt0aGlzLnIyPW5iaSgpO3RoaXMucTM9bmJpKCk7QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKDIqYS50LHRoaXMucjIpO3RoaXMubXU9dGhpcy5yMi5kaXZpZGUoYSk7dGhpcy5tPWF9ZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoYSl7aWYoYS5zPDB8fGEudD4yKnRoaXMubS50KXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle2lmKGEuY29tcGFyZVRvKHRoaXMubSk8MCl7cmV0dXJuIGF9ZWxzZXt2YXIgYj1uYmkoKTthLmNvcHlUbyhiKTt0aGlzLnJlZHVjZShiKTtyZXR1cm4gYn19fWZ1bmN0aW9uIGJhcnJldHRSZXZlcnQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gYmFycmV0dFJlZHVjZShhKXthLmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO2lmKGEudD50aGlzLm0udCsxKXthLnQ9dGhpcy5tLnQrMTthLmNsYW1wKCl9dGhpcy5tdS5tdWx0aXBseVVwcGVyVG8odGhpcy5yMix0aGlzLm0udCsxLHRoaXMucTMpO3RoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO3doaWxlKGEuY29tcGFyZVRvKHRoaXMucjIpPDApe2EuZEFkZE9mZnNldCgxLHRoaXMubS50KzEpfWEuc3ViVG8odGhpcy5yMixhKTt3aGlsZShhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXthLnN1YlRvKHRoaXMubSxhKX19ZnVuY3Rpb24gYmFycmV0dFNxclRvKGEsYil7YS5zcXVhcmVUbyhiKTt0aGlzLnJlZHVjZShiKX1mdW5jdGlvbiBiYXJyZXR0TXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfUJhcnJldHQucHJvdG90eXBlLmNvbnZlcnQ9YmFycmV0dENvbnZlcnQ7QmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0PWJhcnJldHRSZXZlcnQ7QmFycmV0dC5wcm90b3R5cGUucmVkdWNlPWJhcnJldHRSZWR1Y2U7QmFycmV0dC5wcm90b3R5cGUubXVsVG89YmFycmV0dE11bFRvO0JhcnJldHQucHJvdG90eXBlLnNxclRvPWJhcnJldHRTcXJUbztmdW5jdGlvbiBibk1vZFBvdyhxLGYpe3ZhciBvPXEuYml0TGVuZ3RoKCksaCxiPW5idigxKSx2O2lmKG88PTApe3JldHVybiBifWVsc2V7aWYobzwxOCl7aD0xfWVsc2V7aWYobzw0OCl7aD0zfWVsc2V7aWYobzwxNDQpe2g9NH1lbHNle2lmKG88NzY4KXtoPTV9ZWxzZXtoPTZ9fX19fWlmKG88OCl7dj1uZXcgQ2xhc3NpYyhmKX1lbHNle2lmKGYuaXNFdmVuKCkpe3Y9bmV3IEJhcnJldHQoZil9ZWxzZXt2PW5ldyBNb250Z29tZXJ5KGYpfX12YXIgcD1uZXcgQXJyYXkoKSxkPTMscz1oLTEsYT0oMTw8aCktMTtwWzFdPXYuY29udmVydCh0aGlzKTtpZihoPjEpe3ZhciBBPW5iaSgpO3Yuc3FyVG8ocFsxXSxBKTt3aGlsZShkPD1hKXtwW2RdPW5iaSgpO3YubXVsVG8oQSxwW2QtMl0scFtkXSk7ZCs9Mn19dmFyIGw9cS50LTEseCx1PXRydWUsYz1uYmkoKSx5O289bmJpdHMocVtsXSktMTt3aGlsZShsPj0wKXtpZihvPj1zKXt4PShxW2xdPj4oby1zKSkmYX1lbHNle3g9KHFbbF0mKCgxPDwobysxKSktMSkpPDwocy1vKTtpZihsPjApe3h8PXFbbC0xXT4+KHRoaXMuREIrby1zKX19ZD1oO3doaWxlKCh4JjEpPT0wKXt4Pj49MTstLWR9aWYoKG8tPWQpPDApe28rPXRoaXMuREI7LS1sfWlmKHUpe3BbeF0uY29weVRvKGIpO3U9ZmFsc2V9ZWxzZXt3aGlsZShkPjEpe3Yuc3FyVG8oYixjKTt2LnNxclRvKGMsYik7ZC09Mn1pZihkPjApe3Yuc3FyVG8oYixjKX1lbHNle3k9YjtiPWM7Yz15fXYubXVsVG8oYyxwW3hdLGIpfXdoaWxlKGw+PTAmJihxW2xdJigxPDxvKSk9PTApe3Yuc3FyVG8oYixjKTt5PWI7Yj1jO2M9eTtpZigtLW88MCl7bz10aGlzLkRCLTE7LS1sfX19cmV0dXJuIHYucmV2ZXJ0KGIpfWZ1bmN0aW9uIGJuR0NEKGMpe3ZhciBiPSh0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzLmNsb25lKCk7dmFyIGg9KGMuczwwKT9jLm5lZ2F0ZSgpOmMuY2xvbmUoKTtpZihiLmNvbXBhcmVUbyhoKTwwKXt2YXIgZT1iO2I9aDtoPWV9dmFyIGQ9Yi5nZXRMb3dlc3RTZXRCaXQoKSxmPWguZ2V0TG93ZXN0U2V0Qml0KCk7aWYoZjwwKXtyZXR1cm4gYn1pZihkPGYpe2Y9ZH1pZihmPjApe2IuclNoaWZ0VG8oZixiKTtoLnJTaGlmdFRvKGYsaCl9d2hpbGUoYi5zaWdudW0oKT4wKXtpZigoZD1iLmdldExvd2VzdFNldEJpdCgpKT4wKXtiLnJTaGlmdFRvKGQsYil9aWYoKGQ9aC5nZXRMb3dlc3RTZXRCaXQoKSk+MCl7aC5yU2hpZnRUbyhkLGgpfWlmKGIuY29tcGFyZVRvKGgpPj0wKXtiLnN1YlRvKGgsYik7Yi5yU2hpZnRUbygxLGIpfWVsc2V7aC5zdWJUbyhiLGgpO2guclNoaWZ0VG8oMSxoKX19aWYoZj4wKXtoLmxTaGlmdFRvKGYsaCl9cmV0dXJuIGh9ZnVuY3Rpb24gYm5wTW9kSW50KGUpe2lmKGU8PTApe3JldHVybiAwfXZhciBjPXRoaXMuRFYlZSxiPSh0aGlzLnM8MCk/ZS0xOjA7aWYodGhpcy50PjApe2lmKGM9PTApe2I9dGhpc1swXSVlfWVsc2V7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiPShjKmIrdGhpc1thXSklZX19fXJldHVybiBifWZ1bmN0aW9uIGJuTW9kSW52ZXJzZShmKXt2YXIgaj1mLmlzRXZlbigpO2lmKCh0aGlzLmlzRXZlbigpJiZqKXx8Zi5zaWdudW0oKT09MCl7cmV0dXJuIEJpZ0ludGVnZXIuWkVST312YXIgaT1mLmNsb25lKCksaD10aGlzLmNsb25lKCk7dmFyIGc9bmJ2KDEpLGU9bmJ2KDApLGw9bmJ2KDApLGs9bmJ2KDEpO3doaWxlKGkuc2lnbnVtKCkhPTApe3doaWxlKGkuaXNFdmVuKCkpe2kuclNoaWZ0VG8oMSxpKTtpZihqKXtpZighZy5pc0V2ZW4oKXx8IWUuaXNFdmVuKCkpe2cuYWRkVG8odGhpcyxnKTtlLnN1YlRvKGYsZSl9Zy5yU2hpZnRUbygxLGcpfWVsc2V7aWYoIWUuaXNFdmVuKCkpe2Uuc3ViVG8oZixlKX19ZS5yU2hpZnRUbygxLGUpfXdoaWxlKGguaXNFdmVuKCkpe2guclNoaWZ0VG8oMSxoKTtpZihqKXtpZighbC5pc0V2ZW4oKXx8IWsuaXNFdmVuKCkpe2wuYWRkVG8odGhpcyxsKTtrLnN1YlRvKGYsayl9bC5yU2hpZnRUbygxLGwpfWVsc2V7aWYoIWsuaXNFdmVuKCkpe2suc3ViVG8oZixrKX19ay5yU2hpZnRUbygxLGspfWlmKGkuY29tcGFyZVRvKGgpPj0wKXtpLnN1YlRvKGgsaSk7aWYoail7Zy5zdWJUbyhsLGcpfWUuc3ViVG8oayxlKX1lbHNle2guc3ViVG8oaSxoKTtpZihqKXtsLnN1YlRvKGcsbCl9ay5zdWJUbyhlLGspfX1pZihoLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTApe3JldHVybiBCaWdJbnRlZ2VyLlpFUk99aWYoay5jb21wYXJlVG8oZik+PTApe3JldHVybiBrLnN1YnRyYWN0KGYpfWlmKGsuc2lnbnVtKCk8MCl7ay5hZGRUbyhmLGspfWVsc2V7cmV0dXJuIGt9aWYoay5zaWdudW0oKTwwKXtyZXR1cm4gay5hZGQoZil9ZWxzZXtyZXR1cm4ga319dmFyIGxvd3ByaW1lcz1bMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTt2YXIgbHBsaW09KDE8PDI2KS9sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXTtmdW5jdGlvbiBibklzUHJvYmFibGVQcmltZShlKXt2YXIgZCxiPXRoaXMuYWJzKCk7aWYoYi50PT0xJiZiWzBdPD1sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSl7Zm9yKGQ9MDtkPGxvd3ByaW1lcy5sZW5ndGg7KytkKXtpZihiWzBdPT1sb3dwcmltZXNbZF0pe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9aWYoYi5pc0V2ZW4oKSl7cmV0dXJuIGZhbHNlfWQ9MTt3aGlsZShkPGxvd3ByaW1lcy5sZW5ndGgpe3ZhciBhPWxvd3ByaW1lc1tkXSxjPWQrMTt3aGlsZShjPGxvd3ByaW1lcy5sZW5ndGgmJmE8bHBsaW0pe2EqPWxvd3ByaW1lc1tjKytdfWE9Yi5tb2RJbnQoYSk7d2hpbGUoZDxjKXtpZihhJWxvd3ByaW1lc1tkKytdPT0wKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gYi5taWxsZXJSYWJpbihlKX1mdW5jdGlvbiBibnBNaWxsZXJSYWJpbihmKXt2YXIgZz10aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgYz1nLmdldExvd2VzdFNldEJpdCgpO2lmKGM8PTApe3JldHVybiBmYWxzZX12YXIgaD1nLnNoaWZ0UmlnaHQoYyk7Zj0oZisxKT4+MTtpZihmPmxvd3ByaW1lcy5sZW5ndGgpe2Y9bG93cHJpbWVzLmxlbmd0aH12YXIgYj1uYmkoKTtmb3IodmFyIGU9MDtlPGY7KytlKXtiLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO3ZhciBsPWIubW9kUG93KGgsdGhpcyk7aWYobC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0wJiZsLmNvbXBhcmVUbyhnKSE9MCl7dmFyIGQ9MTt3aGlsZShkKys8YyYmbC5jb21wYXJlVG8oZykhPTApe2w9bC5tb2RQb3dJbnQoMix0aGlzKTtpZihsLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTApe3JldHVybiBmYWxzZX19aWYobC5jb21wYXJlVG8oZykhPTApe3JldHVybiBmYWxzZX19fXJldHVybiB0cnVlfUJpZ0ludGVnZXIucHJvdG90eXBlLmNodW5rU2l6ZT1ibnBDaHVua1NpemU7QmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeD1ibnBUb1JhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeD1ibnBGcm9tUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlcj1ibnBGcm9tTnVtYmVyO0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbz1ibnBCaXR3aXNlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0PWJucENoYW5nZUJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGRUbz1ibnBBZGRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5kTXVsdGlwbHk9Ym5wRE11bHRpcGx5O0JpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQ9Ym5wREFkZE9mZnNldDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG89Ym5wTXVsdGlwbHlMb3dlclRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbz1ibnBNdWx0aXBseVVwcGVyVG87QmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50PWJucE1vZEludDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5taWxsZXJSYWJpbj1ibnBNaWxsZXJSYWJpbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZT1ibkNsb25lO0JpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlPWJuSW50VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlPWJuQnl0ZVZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWU9Ym5TaG9ydFZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLnNpZ251bT1iblNpZ051bTtCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheT1iblRvQnl0ZUFycmF5O0JpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscz1ibkVxdWFscztCaWdJbnRlZ2VyLnByb3RvdHlwZS5taW49Ym5NaW47QmlnSW50ZWdlci5wcm90b3R5cGUubWF4PWJuTWF4O0JpZ0ludGVnZXIucHJvdG90eXBlLmFuZD1ibkFuZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5vcj1ibk9yO0JpZ0ludGVnZXIucHJvdG90eXBlLnhvcj1iblhvcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3Q9Ym5BbmROb3Q7QmlnSW50ZWdlci5wcm90b3R5cGUubm90PWJuTm90O0JpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdD1iblNoaWZ0TGVmdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0PWJuU2hpZnRSaWdodDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQ9Ym5HZXRMb3dlc3RTZXRCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQ9Ym5CaXRDb3VudDtCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0PWJuVGVzdEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zZXRCaXQ9Ym5TZXRCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQ9Ym5DbGVhckJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0PWJuRmxpcEJpdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQ9Ym5BZGQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3Q9Ym5TdWJ0cmFjdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseT1ibk11bHRpcGx5O0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZT1ibkRpdmlkZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXI9Ym5SZW1haW5kZXI7QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyPWJuRGl2aWRlQW5kUmVtYWluZGVyO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvdz1ibk1vZFBvdztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlPWJuTW9kSW52ZXJzZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3c9Ym5Qb3c7QmlnSW50ZWdlci5wcm90b3R5cGUuZ2NkPWJuR0NEO0JpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZT1ibklzUHJvYmFibGVQcmltZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmU9Ym5TcXVhcmU7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gQXJjZm91cigpe3RoaXMuaT0wO3RoaXMuaj0wO3RoaXMuUz1uZXcgQXJyYXkoKX1mdW5jdGlvbiBBUkM0aW5pdChkKXt2YXIgYyxhLGI7Zm9yKGM9MDtjPDI1NjsrK2Mpe3RoaXMuU1tjXT1jfWE9MDtmb3IoYz0wO2M8MjU2OysrYyl7YT0oYSt0aGlzLlNbY10rZFtjJWQubGVuZ3RoXSkmMjU1O2I9dGhpcy5TW2NdO3RoaXMuU1tjXT10aGlzLlNbYV07dGhpcy5TW2FdPWJ9dGhpcy5pPTA7dGhpcy5qPTB9ZnVuY3Rpb24gQVJDNG5leHQoKXt2YXIgYTt0aGlzLmk9KHRoaXMuaSsxKSYyNTU7dGhpcy5qPSh0aGlzLmordGhpcy5TW3RoaXMuaV0pJjI1NTthPXRoaXMuU1t0aGlzLmldO3RoaXMuU1t0aGlzLmldPXRoaXMuU1t0aGlzLmpdO3RoaXMuU1t0aGlzLmpdPWE7cmV0dXJuIHRoaXMuU1soYSt0aGlzLlNbdGhpcy5pXSkmMjU1XX1BcmNmb3VyLnByb3RvdHlwZS5pbml0PUFSQzRpbml0O0FyY2ZvdXIucHJvdG90eXBlLm5leHQ9QVJDNG5leHQ7ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpe3JldHVybiBuZXcgQXJjZm91cigpfXZhciBybmdfcHNpemU9MjU2O1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbnZhciBybmdfc3RhdGU7dmFyIHJuZ19wb29sO3ZhciBybmdfcHB0cjtmdW5jdGlvbiBybmdfc2VlZF9pbnQoYSl7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePWEmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+OCkmMjU1O3JuZ19wb29sW3JuZ19wcHRyKytdXj0oYT4+MTYpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjI0KSYyNTU7aWYocm5nX3BwdHI+PXJuZ19wc2l6ZSl7cm5nX3BwdHItPXJuZ19wc2l6ZX19ZnVuY3Rpb24gcm5nX3NlZWRfdGltZSgpe3JuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSl9aWYocm5nX3Bvb2w9PW51bGwpe3JuZ19wb29sPW5ldyBBcnJheSgpO3JuZ19wcHRyPTA7dmFyIHQ7aWYod2luZG93LmNyeXB0byYmd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciB1YT1uZXcgVWludDhBcnJheSgzMik7d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXModWEpO2Zvcih0PTA7dDwzMjsrK3Qpe3JuZ19wb29sW3JuZ19wcHRyKytdPXVhW3RdfX1pZihuYXZpZ2F0b3IuYXBwTmFtZT09XCJOZXRzY2FwZVwiJiZuYXZpZ2F0b3IuYXBwVmVyc2lvbjxcIjVcIiYmd2luZG93LmNyeXB0byl7dmFyIHo9d2luZG93LmNyeXB0by5yYW5kb20oMzIpO2Zvcih0PTA7dDx6Lmxlbmd0aDsrK3Qpe3JuZ19wb29sW3JuZ19wcHRyKytdPXouY2hhckNvZGVBdCh0KSYyNTV9fXdoaWxlKHJuZ19wcHRyPHJuZ19wc2l6ZSl7dD1NYXRoLmZsb29yKDY1NTM2Kk1hdGgucmFuZG9tKCkpO3JuZ19wb29sW3JuZ19wcHRyKytdPXQ+Pj44O3JuZ19wb29sW3JuZ19wcHRyKytdPXQmMjU1fXJuZ19wcHRyPTA7cm5nX3NlZWRfdGltZSgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZSgpe2lmKHJuZ19zdGF0ZT09bnVsbCl7cm5nX3NlZWRfdGltZSgpO3JuZ19zdGF0ZT1wcm5nX25ld3N0YXRlKCk7cm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO2ZvcihybmdfcHB0cj0wO3JuZ19wcHRyPHJuZ19wb29sLmxlbmd0aDsrK3JuZ19wcHRyKXtybmdfcG9vbFtybmdfcHB0cl09MH1ybmdfcHB0cj0wfXJldHVybiBybmdfc3RhdGUubmV4dCgpfWZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYil7dmFyIGE7Zm9yKGE9MDthPGIubGVuZ3RoOysrYSl7YlthXT1ybmdfZ2V0X2J5dGUoKX19ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCl7fVNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzPXJuZ19nZXRfYnl0ZXM7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gcGFyc2VCaWdJbnQoYixhKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoYixhKX1mdW5jdGlvbiBsaW5lYnJrKGMsZCl7dmFyIGE9XCJcIjt2YXIgYj0wO3doaWxlKGIrZDxjLmxlbmd0aCl7YSs9Yy5zdWJzdHJpbmcoYixiK2QpK1wiXFxuXCI7Yis9ZH1yZXR1cm4gYStjLnN1YnN0cmluZyhiLGMubGVuZ3RoKX1mdW5jdGlvbiBieXRlMkhleChhKXtpZihhPDE2KXtyZXR1cm5cIjBcIithLnRvU3RyaW5nKDE2KX1lbHNle3JldHVybiBhLnRvU3RyaW5nKDE2KX19ZnVuY3Rpb24gcGtjczFwYWQyKGUsaCl7aWYoaDxlLmxlbmd0aCsxMSl7YWxlcnQoXCJNZXNzYWdlIHRvbyBsb25nIGZvciBSU0FcIik7cmV0dXJuIG51bGx9dmFyIGc9bmV3IEFycmF5KCk7dmFyIGQ9ZS5sZW5ndGgtMTt3aGlsZShkPj0wJiZoPjApe3ZhciBmPWUuY2hhckNvZGVBdChkLS0pO2lmKGY8MTI4KXtnWy0taF09Zn1lbHNle2lmKChmPjEyNykmJihmPDIwNDgpKXtnWy0taF09KGYmNjMpfDEyODtnWy0taF09KGY+PjYpfDE5Mn1lbHNle2dbLS1oXT0oZiY2Myl8MTI4O2dbLS1oXT0oKGY+PjYpJjYzKXwxMjg7Z1stLWhdPShmPj4xMil8MjI0fX19Z1stLWhdPTA7dmFyIGI9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBhPW5ldyBBcnJheSgpO3doaWxlKGg+Mil7YVswXT0wO3doaWxlKGFbMF09PTApe2IubmV4dEJ5dGVzKGEpfWdbLS1oXT1hWzBdfWdbLS1oXT0yO2dbLS1oXT0wO3JldHVybiBuZXcgQmlnSW50ZWdlcihnKX1mdW5jdGlvbiBvYWVwX21nZjFfYXJyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1lKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGMuY29uY2F0KFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSkpO2QrPTF9cmV0dXJuIGJ9dmFyIFNIQTFfU0laRT0yMDtmdW5jdGlvbiBvYWVwX3BhZChsLGEsYyl7aWYobC5sZW5ndGgrMipTSEExX1NJWkUrMj5hKXt0aHJvd1wiTWVzc2FnZSB0b28gbG9uZyBmb3IgUlNBXCJ9dmFyIGg9XCJcIixkO2ZvcihkPTA7ZDxhLWwubGVuZ3RoLTIqU0hBMV9TSVpFLTI7ZCs9MSl7aCs9XCJcXHgwMFwifXZhciBlPXJzdHJfc2hhMShcIlwiKStoK1wiXFx4MDFcIitsO3ZhciBmPW5ldyBBcnJheShTSEExX1NJWkUpO25ldyBTZWN1cmVSYW5kb20oKS5uZXh0Qnl0ZXMoZik7dmFyIGc9b2FlcF9tZ2YxX2FycihmLGUubGVuZ3RoLGN8fHJzdHJfc2hhMSk7dmFyIGs9W107Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTEpe2tbZF09ZS5jaGFyQ29kZUF0KGQpXmcuY2hhckNvZGVBdChkKX12YXIgaj1vYWVwX21nZjFfYXJyKGssZi5sZW5ndGgscnN0cl9zaGExKTt2YXIgYj1bMF07Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrPTEpe2JbZCsxXT1mW2RdXmouY2hhckNvZGVBdChkKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoYi5jb25jYXQoaykpfWZ1bmN0aW9uIFJTQUtleSgpe3RoaXMubj1udWxsO3RoaXMuZT0wO3RoaXMuZD1udWxsO3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZG1wMT1udWxsO3RoaXMuZG1xMT1udWxsO3RoaXMuY29lZmY9bnVsbH1mdW5jdGlvbiBSU0FTZXRQdWJsaWMoYixhKXt0aGlzLmlzUHVibGljPXRydWU7aWYodHlwZW9mIGIhPT1cInN0cmluZ1wiKXt0aGlzLm49Yjt0aGlzLmU9YX1lbHNle2lmKGIhPW51bGwmJmEhPW51bGwmJmIubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHB1YmxpYyBrZXlcIil9fX1mdW5jdGlvbiBSU0FEb1B1YmxpYyhhKXtyZXR1cm4gYS5tb2RQb3dJbnQodGhpcy5lLHRoaXMubil9ZnVuY3Rpb24gUlNBRW5jcnlwdChkKXt2YXIgYT1wa2NzMXBhZDIoZCwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgZT10aGlzLmRvUHVibGljKGEpO2lmKGU9PW51bGwpe3JldHVybiBudWxsfXZhciBiPWUudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCYxKT09MCl7cmV0dXJuIGJ9ZWxzZXtyZXR1cm5cIjBcIitifX1mdW5jdGlvbiBSU0FFbmNyeXB0T0FFUChlLGQpe3ZhciBhPW9hZXBfcGFkKGUsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+MyxkKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgZj10aGlzLmRvUHVibGljKGEpO2lmKGY9PW51bGwpe3JldHVybiBudWxsfXZhciBiPWYudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCYxKT09MCl7cmV0dXJuIGJ9ZWxzZXtyZXR1cm5cIjBcIitifX1SU0FLZXkucHJvdG90eXBlLmRvUHVibGljPVJTQURvUHVibGljO1JTQUtleS5wcm90b3R5cGUuc2V0UHVibGljPVJTQVNldFB1YmxpYztSU0FLZXkucHJvdG90eXBlLmVuY3J5cHQ9UlNBRW5jcnlwdDtSU0FLZXkucHJvdG90eXBlLmVuY3J5cHRPQUVQPVJTQUVuY3J5cHRPQUVQO1JTQUtleS5wcm90b3R5cGUudHlwZT1cIlJTQVwiO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIHBrY3MxdW5wYWQyKGcsail7dmFyIGE9Zy50b0J5dGVBcnJheSgpO3ZhciBmPTA7d2hpbGUoZjxhLmxlbmd0aCYmYVtmXT09MCl7KytmfWlmKGEubGVuZ3RoLWYhPWotMXx8YVtmXSE9Mil7cmV0dXJuIG51bGx9KytmO3doaWxlKGFbZl0hPTApe2lmKCsrZj49YS5sZW5ndGgpe3JldHVybiBudWxsfX12YXIgZT1cIlwiO3doaWxlKCsrZjxhLmxlbmd0aCl7dmFyIGg9YVtmXSYyNTU7aWYoaDwxMjgpe2UrPVN0cmluZy5mcm9tQ2hhckNvZGUoaCl9ZWxzZXtpZigoaD4xOTEpJiYoaDwyMjQpKXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgoaCYzMSk8PDYpfChhW2YrMV0mNjMpKTsrK2Z9ZWxzZXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgoaCYxNSk8PDEyKXwoKGFbZisxXSY2Myk8PDYpfChhW2YrMl0mNjMpKTtmKz0yfX19cmV0dXJuIGV9ZnVuY3Rpb24gb2FlcF9tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9ZShjK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLFsoZCY0Mjc4MTkwMDgwKT4+MjQsKGQmMTY3MTE2ODApPj4xNiwoZCY2NTI4MCk+PjgsZCYyNTVdKSk7ZCs9MX1yZXR1cm4gYn12YXIgU0hBMV9TSVpFPTIwO2Z1bmN0aW9uIG9hZXBfdW5wYWQobCxiLGUpe2w9bC50b0J5dGVBcnJheSgpO3ZhciBmO2ZvcihmPTA7ZjxsLmxlbmd0aDtmKz0xKXtsW2ZdJj0yNTV9d2hpbGUobC5sZW5ndGg8Yil7bC51bnNoaWZ0KDApfWw9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsbCk7aWYobC5sZW5ndGg8MipTSEExX1NJWkUrMil7dGhyb3dcIkNpcGhlciB0b28gc2hvcnRcIn12YXIgYz1sLnN1YnN0cigxLFNIQTFfU0laRSk7dmFyIG89bC5zdWJzdHIoU0hBMV9TSVpFKzEpO3ZhciBtPW9hZXBfbWdmMV9zdHIobyxTSEExX1NJWkUsZXx8cnN0cl9zaGExKTt2YXIgaD1bXSxmO2ZvcihmPTA7ZjxjLmxlbmd0aDtmKz0xKXtoW2ZdPWMuY2hhckNvZGVBdChmKV5tLmNoYXJDb2RlQXQoZil9dmFyIGo9b2FlcF9tZ2YxX3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxoKSxsLmxlbmd0aC1TSEExX1NJWkUscnN0cl9zaGExKTt2YXIgZz1bXTtmb3IoZj0wO2Y8by5sZW5ndGg7Zis9MSl7Z1tmXT1vLmNoYXJDb2RlQXQoZileai5jaGFyQ29kZUF0KGYpfWc9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZyk7aWYoZy5zdWJzdHIoMCxTSEExX1NJWkUpIT09cnN0cl9zaGExKFwiXCIpKXt0aHJvd1wiSGFzaCBtaXNtYXRjaFwifWc9Zy5zdWJzdHIoU0hBMV9TSVpFKTt2YXIgYT1nLmluZGV4T2YoXCJcXHgwMVwiKTt2YXIgaz0oYSE9LTEpP2cuc3Vic3RyKDAsYSkubGFzdEluZGV4T2YoXCJcXHgwMFwiKTotMTtpZihrKzEhPWEpe3Rocm93XCJNYWxmb3JtZWQgZGF0YVwifXJldHVybiBnLnN1YnN0cihhKzEpfWZ1bmN0aW9uIFJTQVNldFByaXZhdGUoYyxhLGIpe3RoaXMuaXNQcml2YXRlPXRydWU7aWYodHlwZW9mIGMhPT1cInN0cmluZ1wiKXt0aGlzLm49Yzt0aGlzLmU9YTt0aGlzLmQ9Yn1lbHNle2lmKGMhPW51bGwmJmEhPW51bGwmJmMubGVuZ3RoPjAmJmEubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChjLDE2KTt0aGlzLmU9cGFyc2VJbnQoYSwxNik7dGhpcy5kPXBhcnNlQmlnSW50KGIsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwcml2YXRlIGtleVwiKX19fWZ1bmN0aW9uIFJTQVNldFByaXZhdGVFeChnLGQsZSxjLGIsYSxoLGYpe3RoaXMuaXNQcml2YXRlPXRydWU7aWYoZz09bnVsbCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBOID09IG51bGxcIn1pZihkPT1udWxsKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IEUgPT0gbnVsbFwifWlmKGcubGVuZ3RoPT0wKXt0aHJvd1wiUlNBU2V0UHJpdmF0ZUV4IE4ubGVuZ3RoID09IDBcIn1pZihkLmxlbmd0aD09MCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBFLmxlbmd0aCA9PSAwXCJ9aWYoZyE9bnVsbCYmZCE9bnVsbCYmZy5sZW5ndGg+MCYmZC5sZW5ndGg+MCl7dGhpcy5uPXBhcnNlQmlnSW50KGcsMTYpO3RoaXMuZT1wYXJzZUludChkLDE2KTt0aGlzLmQ9cGFyc2VCaWdJbnQoZSwxNik7dGhpcy5wPXBhcnNlQmlnSW50KGMsMTYpO3RoaXMucT1wYXJzZUJpZ0ludChiLDE2KTt0aGlzLmRtcDE9cGFyc2VCaWdJbnQoYSwxNik7dGhpcy5kbXExPXBhcnNlQmlnSW50KGgsMTYpO3RoaXMuY29lZmY9cGFyc2VCaWdJbnQoZiwxNil9ZWxzZXthbGVydChcIkludmFsaWQgUlNBIHByaXZhdGUga2V5IGluIFJTQVNldFByaXZhdGVFeFwiKX19ZnVuY3Rpb24gUlNBR2VuZXJhdGUoYixpKXt2YXIgYT1uZXcgU2VjdXJlUmFuZG9tKCk7dmFyIGY9Yj4+MTt0aGlzLmU9cGFyc2VJbnQoaSwxNik7dmFyIGM9bmV3IEJpZ0ludGVnZXIoaSwxNik7Zm9yKDs7KXtmb3IoOzspe3RoaXMucD1uZXcgQmlnSW50ZWdlcihiLWYsMSxhKTtpZih0aGlzLnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wJiZ0aGlzLnAuaXNQcm9iYWJsZVByaW1lKDEwKSl7YnJlYWt9fWZvcig7Oyl7dGhpcy5xPW5ldyBCaWdJbnRlZ2VyKGYsMSxhKTtpZih0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChjKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wJiZ0aGlzLnEuaXNQcm9iYWJsZVByaW1lKDEwKSl7YnJlYWt9fWlmKHRoaXMucC5jb21wYXJlVG8odGhpcy5xKTw9MCl7dmFyIGg9dGhpcy5wO3RoaXMucD10aGlzLnE7dGhpcy5xPWh9dmFyIGc9dGhpcy5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgZD10aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciBlPWcubXVsdGlwbHkoZCk7aWYoZS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCl7dGhpcy5uPXRoaXMucC5tdWx0aXBseSh0aGlzLnEpO3RoaXMuZD1jLm1vZEludmVyc2UoZSk7dGhpcy5kbXAxPXRoaXMuZC5tb2QoZyk7dGhpcy5kbXExPXRoaXMuZC5tb2QoZCk7dGhpcy5jb2VmZj10aGlzLnEubW9kSW52ZXJzZSh0aGlzLnApO2JyZWFrfX19ZnVuY3Rpb24gUlNBRG9Qcml2YXRlKGEpe2lmKHRoaXMucD09bnVsbHx8dGhpcy5xPT1udWxsKXtyZXR1cm4gYS5tb2RQb3codGhpcy5kLHRoaXMubil9dmFyIGM9YS5tb2QodGhpcy5wKS5tb2RQb3codGhpcy5kbXAxLHRoaXMucCk7dmFyIGI9YS5tb2QodGhpcy5xKS5tb2RQb3codGhpcy5kbXExLHRoaXMucSk7d2hpbGUoYy5jb21wYXJlVG8oYik8MCl7Yz1jLmFkZCh0aGlzLnApfXJldHVybiBjLnN1YnRyYWN0KGIpLm11bHRpcGx5KHRoaXMuY29lZmYpLm1vZCh0aGlzLnApLm11bHRpcGx5KHRoaXMucSkuYWRkKGIpfWZ1bmN0aW9uIFJTQURlY3J5cHQoYil7dmFyIGQ9cGFyc2VCaWdJbnQoYiwxNik7dmFyIGE9dGhpcy5kb1ByaXZhdGUoZCk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIHBrY3MxdW5wYWQyKGEsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myl9ZnVuY3Rpb24gUlNBRGVjcnlwdE9BRVAoZCxiKXt2YXIgZT1wYXJzZUJpZ0ludChkLDE2KTt2YXIgYT10aGlzLmRvUHJpdmF0ZShlKTtpZihhPT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gb2FlcF91bnBhZChhLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMsYil9UlNBS2V5LnByb3RvdHlwZS5kb1ByaXZhdGU9UlNBRG9Qcml2YXRlO1JTQUtleS5wcm90b3R5cGUuc2V0UHJpdmF0ZT1SU0FTZXRQcml2YXRlO1JTQUtleS5wcm90b3R5cGUuc2V0UHJpdmF0ZUV4PVJTQVNldFByaXZhdGVFeDtSU0FLZXkucHJvdG90eXBlLmdlbmVyYXRlPVJTQUdlbmVyYXRlO1JTQUtleS5wcm90b3R5cGUuZGVjcnlwdD1SU0FEZWNyeXB0O1JTQUtleS5wcm90b3R5cGUuZGVjcnlwdE9BRVA9UlNBRGVjcnlwdE9BRVA7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gRUNGaWVsZEVsZW1lbnRGcChiLGEpe3RoaXMueD1hO3RoaXMucT1ifWZ1bmN0aW9uIGZlRnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9cmV0dXJuKHRoaXMucS5lcXVhbHMoYS5xKSYmdGhpcy54LmVxdWFscyhhLngpKX1mdW5jdGlvbiBmZUZwVG9CaWdJbnRlZ2VyKCl7cmV0dXJuIHRoaXMueH1mdW5jdGlvbiBmZUZwTmVnYXRlKCl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubmVnYXRlKCkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBBZGQoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguYWRkKGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwU3VidHJhY3QoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLnguc3VidHJhY3QoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBNdWx0aXBseShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFNxdWFyZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnNxdWFyZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwRGl2aWRlKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm11bHRpcGx5KGEudG9CaWdJbnRlZ2VyKCkubW9kSW52ZXJzZSh0aGlzLnEpKS5tb2QodGhpcy5xKSl9RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZXF1YWxzPWZlRnBFcXVhbHM7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUudG9CaWdJbnRlZ2VyPWZlRnBUb0JpZ0ludGVnZXI7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubmVnYXRlPWZlRnBOZWdhdGU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuYWRkPWZlRnBBZGQ7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3VidHJhY3Q9ZmVGcFN1YnRyYWN0O0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm11bHRpcGx5PWZlRnBNdWx0aXBseTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5zcXVhcmU9ZmVGcFNxdWFyZTtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5kaXZpZGU9ZmVGcERpdmlkZTtmdW5jdGlvbiBFQ1BvaW50RnAoYyxhLGQsYil7dGhpcy5jdXJ2ZT1jO3RoaXMueD1hO3RoaXMueT1kO2lmKGI9PW51bGwpe3RoaXMuej1CaWdJbnRlZ2VyLk9ORX1lbHNle3RoaXMuej1ifXRoaXMuemludj1udWxsfWZ1bmN0aW9uIHBvaW50RnBHZXRYKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEdldFkoKXtpZih0aGlzLnppbnY9PW51bGwpe3RoaXMuemludj10aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpfXJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpLm1vZCh0aGlzLmN1cnZlLnEpKX1mdW5jdGlvbiBwb2ludEZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfWlmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gYS5pc0luZmluaXR5KCl9aWYoYS5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKX12YXIgYyxiO2M9YS55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO2lmKCFjLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKXtyZXR1cm4gZmFsc2V9Yj1hLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLngudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkoYS56KSkubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIGIuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyl9ZnVuY3Rpb24gcG9pbnRGcElzSW5maW5pdHkoKXtpZigodGhpcy54PT1udWxsKSYmKHRoaXMueT09bnVsbCkpe3JldHVybiB0cnVlfXJldHVybiB0aGlzLnouZXF1YWxzKEJpZ0ludGVnZXIuWkVSTykmJiF0aGlzLnkudG9CaWdJbnRlZ2VyKCkuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyl9ZnVuY3Rpb24gcG9pbnRGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy54LHRoaXMueS5uZWdhdGUoKSx0aGlzLnopfWZ1bmN0aW9uIHBvaW50RnBBZGQobCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBsfWlmKGwuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc312YXIgcD1sLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56KS5zdWJ0cmFjdCh0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkobC56KSkubW9kKHRoaXMuY3VydmUucSk7dmFyIG89bC54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO2lmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHMobykpe2lmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHMocCkpe3JldHVybiB0aGlzLnR3aWNlKCl9cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgaj1uZXcgQmlnSW50ZWdlcihcIjNcIik7dmFyIGU9dGhpcy54LnRvQmlnSW50ZWdlcigpO3ZhciBuPXRoaXMueS50b0JpZ0ludGVnZXIoKTt2YXIgYz1sLngudG9CaWdJbnRlZ2VyKCk7dmFyIGs9bC55LnRvQmlnSW50ZWdlcigpO3ZhciBtPW8uc3F1YXJlKCk7dmFyIGk9bS5tdWx0aXBseShvKTt2YXIgZD1lLm11bHRpcGx5KG0pO3ZhciBnPXAuc3F1YXJlKCkubXVsdGlwbHkodGhpcy56KTt2YXIgYT1nLnN1YnRyYWN0KGQuc2hpZnRMZWZ0KDEpKS5tdWx0aXBseShsLnopLnN1YnRyYWN0KGkpLm11bHRpcGx5KG8pLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBoPWQubXVsdGlwbHkoaikubXVsdGlwbHkocCkuc3VidHJhY3Qobi5tdWx0aXBseShpKSkuc3VidHJhY3QoZy5tdWx0aXBseShwKSkubXVsdGlwbHkobC56KS5hZGQocC5tdWx0aXBseShpKSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGY9aS5tdWx0aXBseSh0aGlzLnopLm11bHRpcGx5KGwueikubW9kKHRoaXMuY3VydmUucSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGEpLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoaCksZil9ZnVuY3Rpb24gcG9pbnRGcFR3aWNlKCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1uZXcgQmlnSW50ZWdlcihcIjNcIik7dmFyIGM9dGhpcy54LnRvQmlnSW50ZWdlcigpO3ZhciBoPXRoaXMueS50b0JpZ0ludGVnZXIoKTt2YXIgZT1oLm11bHRpcGx5KHRoaXMueik7dmFyIGo9ZS5tdWx0aXBseShoKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaT10aGlzLmN1cnZlLmEudG9CaWdJbnRlZ2VyKCk7dmFyIGs9Yy5zcXVhcmUoKS5tdWx0aXBseShnKTtpZighQmlnSW50ZWdlci5aRVJPLmVxdWFscyhpKSl7az1rLmFkZCh0aGlzLnouc3F1YXJlKCkubXVsdGlwbHkoaSkpfWs9ay5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgYj1rLnNxdWFyZSgpLnN1YnRyYWN0KGMuc2hpZnRMZWZ0KDMpLm11bHRpcGx5KGopKS5zaGlmdExlZnQoMSkubXVsdGlwbHkoZSkubW9kKHRoaXMuY3VydmUucSk7dmFyIGY9ay5tdWx0aXBseShnKS5tdWx0aXBseShjKS5zdWJ0cmFjdChqLnNoaWZ0TGVmdCgxKSkuc2hpZnRMZWZ0KDIpLm11bHRpcGx5KGopLnN1YnRyYWN0KGsuc3F1YXJlKCkubXVsdGlwbHkoaykpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBkPWUuc3F1YXJlKCkubXVsdGlwbHkoZSkuc2hpZnRMZWZ0KDMpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihiKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGYpLGQpfWZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseShiKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYoYi5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1iO3ZhciBmPWcubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoXCIzXCIpKTt2YXIgbD10aGlzLm5lZ2F0ZSgpO3ZhciBkPXRoaXM7dmFyIGM7Zm9yKGM9Zi5iaXRMZW5ndGgoKS0yO2M+MDstLWMpe2Q9ZC50d2ljZSgpO3ZhciBhPWYudGVzdEJpdChjKTt2YXIgaj1nLnRlc3RCaXQoYyk7aWYoYSE9ail7ZD1kLmFkZChhP3RoaXM6bCl9fXJldHVybiBkfWZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseVR3byhjLGEsYil7dmFyIGQ7aWYoYy5iaXRMZW5ndGgoKT5iLmJpdExlbmd0aCgpKXtkPWMuYml0TGVuZ3RoKCktMX1lbHNle2Q9Yi5iaXRMZW5ndGgoKS0xfXZhciBmPXRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKTt2YXIgZT10aGlzLmFkZChhKTt3aGlsZShkPj0wKXtmPWYudHdpY2UoKTtpZihjLnRlc3RCaXQoZCkpe2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChlKX1lbHNle2Y9Zi5hZGQodGhpcyl9fWVsc2V7aWYoYi50ZXN0Qml0KGQpKXtmPWYuYWRkKGEpfX0tLWR9cmV0dXJuIGZ9RUNQb2ludEZwLnByb3RvdHlwZS5nZXRYPXBvaW50RnBHZXRYO0VDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WT1wb2ludEZwR2V0WTtFQ1BvaW50RnAucHJvdG90eXBlLmVxdWFscz1wb2ludEZwRXF1YWxzO0VDUG9pbnRGcC5wcm90b3R5cGUuaXNJbmZpbml0eT1wb2ludEZwSXNJbmZpbml0eTtFQ1BvaW50RnAucHJvdG90eXBlLm5lZ2F0ZT1wb2ludEZwTmVnYXRlO0VDUG9pbnRGcC5wcm90b3R5cGUuYWRkPXBvaW50RnBBZGQ7RUNQb2ludEZwLnByb3RvdHlwZS50d2ljZT1wb2ludEZwVHdpY2U7RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseT1wb2ludEZwTXVsdGlwbHk7RUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseVR3bz1wb2ludEZwTXVsdGlwbHlUd287ZnVuY3Rpb24gRUNDdXJ2ZUZwKGUsZCxjKXt0aGlzLnE9ZTt0aGlzLmE9dGhpcy5mcm9tQmlnSW50ZWdlcihkKTt0aGlzLmI9dGhpcy5mcm9tQmlnSW50ZWdlcihjKTt0aGlzLmluZmluaXR5PW5ldyBFQ1BvaW50RnAodGhpcyxudWxsLG51bGwpfWZ1bmN0aW9uIGN1cnZlRnBHZXRRKCl7cmV0dXJuIHRoaXMucX1mdW5jdGlvbiBjdXJ2ZUZwR2V0QSgpe3JldHVybiB0aGlzLmF9ZnVuY3Rpb24gY3VydmVGcEdldEIoKXtyZXR1cm4gdGhpcy5ifWZ1bmN0aW9uIGN1cnZlRnBFcXVhbHMoYSl7aWYoYT09dGhpcyl7cmV0dXJuIHRydWV9cmV0dXJuKHRoaXMucS5lcXVhbHMoYS5xKSYmdGhpcy5hLmVxdWFscyhhLmEpJiZ0aGlzLmIuZXF1YWxzKGEuYikpfWZ1bmN0aW9uIGN1cnZlRnBHZXRJbmZpbml0eSgpe3JldHVybiB0aGlzLmluZmluaXR5fWZ1bmN0aW9uIGN1cnZlRnBGcm9tQmlnSW50ZWdlcihhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLGEpfWZ1bmN0aW9uIGN1cnZlRnBEZWNvZGVQb2ludEhleChkKXtzd2l0Y2gocGFyc2VJbnQoZC5zdWJzdHIoMCwyKSwxNikpe2Nhc2UgMDpyZXR1cm4gdGhpcy5pbmZpbml0eTtjYXNlIDI6Y2FzZSAzOnJldHVybiBudWxsO2Nhc2UgNDpjYXNlIDY6Y2FzZSA3OnZhciBhPShkLmxlbmd0aC0yKS8yO3ZhciBjPWQuc3Vic3RyKDIsYSk7dmFyIGI9ZC5zdWJzdHIoYSsyLGEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMsdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcihjLDE2KSksdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcihiLDE2KSkpO2RlZmF1bHQ6cmV0dXJuIG51bGx9fUVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0UT1jdXJ2ZUZwR2V0UTtFQ0N1cnZlRnAucHJvdG90eXBlLmdldEE9Y3VydmVGcEdldEE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRCPWN1cnZlRnBHZXRCO0VDQ3VydmVGcC5wcm90b3R5cGUuZXF1YWxzPWN1cnZlRnBFcXVhbHM7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRJbmZpbml0eT1jdXJ2ZUZwR2V0SW5maW5pdHk7RUNDdXJ2ZUZwLnByb3RvdHlwZS5mcm9tQmlnSW50ZWdlcj1jdXJ2ZUZwRnJvbUJpZ0ludGVnZXI7RUNDdXJ2ZUZwLnByb3RvdHlwZS5kZWNvZGVQb2ludEhleD1jdXJ2ZUZwRGVjb2RlUG9pbnRIZXg7XG4vKiEgKGMpIFN0ZWZhbiBUaG9tYXMgfCBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbmpzL2JpdGNvaW5qcy1saWJcbiAqL1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZ2V0Qnl0ZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKCh0aGlzLnRvQmlnSW50ZWdlcigpLmJpdExlbmd0aCgpKzcpLzgpfTtFQ1BvaW50RnAucHJvdG90eXBlLmdldEVuY29kZWQ9ZnVuY3Rpb24oYyl7dmFyIGQ9ZnVuY3Rpb24oaCxmKXt2YXIgZz1oLnRvQnl0ZUFycmF5VW5zaWduZWQoKTtpZihmPGcubGVuZ3RoKXtnPWcuc2xpY2UoZy5sZW5ndGgtZil9ZWxzZXt3aGlsZShmPmcubGVuZ3RoKXtnLnVuc2hpZnQoMCl9fXJldHVybiBnfTt2YXIgYT10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgZT10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTt2YXIgYj1kKGEsMzIpO2lmKGMpe2lmKGUuaXNFdmVuKCkpe2IudW5zaGlmdCgyKX1lbHNle2IudW5zaGlmdCgzKX19ZWxzZXtiLnVuc2hpZnQoNCk7Yj1iLmNvbmNhdChkKGUsMzIpKX1yZXR1cm4gYn07RUNQb2ludEZwLmRlY29kZUZyb209ZnVuY3Rpb24oZyxjKXt2YXIgZj1jWzBdO3ZhciBlPWMubGVuZ3RoLTE7dmFyIGQ9Yy5zbGljZSgxLDErZS8yKTt2YXIgYj1jLnNsaWNlKDErZS8yLDErZSk7ZC51bnNoaWZ0KDApO2IudW5zaGlmdCgwKTt2YXIgYT1uZXcgQmlnSW50ZWdlcihkKTt2YXIgaD1uZXcgQmlnSW50ZWdlcihiKTtyZXR1cm4gbmV3IEVDUG9pbnRGcChnLGcuZnJvbUJpZ0ludGVnZXIoYSksZy5mcm9tQmlnSW50ZWdlcihoKSl9O0VDUG9pbnRGcC5kZWNvZGVGcm9tSGV4PWZ1bmN0aW9uKGcsYyl7dmFyIGY9Yy5zdWJzdHIoMCwyKTt2YXIgZT1jLmxlbmd0aC0yO3ZhciBkPWMuc3Vic3RyKDIsZS8yKTt2YXIgYj1jLnN1YnN0cigyK2UvMixlLzIpO3ZhciBhPW5ldyBCaWdJbnRlZ2VyKGQsMTYpO3ZhciBoPW5ldyBCaWdJbnRlZ2VyKGIsMTYpO3JldHVybiBuZXcgRUNQb2ludEZwKGcsZy5mcm9tQmlnSW50ZWdlcihhKSxnLmZyb21CaWdJbnRlZ2VyKGgpKX07RUNQb2ludEZwLnByb3RvdHlwZS5hZGQyRD1mdW5jdGlvbihjKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGN9aWYoYy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueC5lcXVhbHMoYy54KSl7aWYodGhpcy55LmVxdWFscyhjLnkpKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yy54LnN1YnRyYWN0KHRoaXMueCk7dmFyIGU9Yy55LnN1YnRyYWN0KHRoaXMueSk7dmFyIGE9ZS5kaXZpZGUoZyk7dmFyIGQ9YS5zcXVhcmUoKS5zdWJ0cmFjdCh0aGlzLngpLnN1YnRyYWN0KGMueCk7dmFyIGY9YS5tdWx0aXBseSh0aGlzLnguc3VidHJhY3QoZCkpLnN1YnRyYWN0KHRoaXMueSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSxkLGYpfTtFQ1BvaW50RnAucHJvdG90eXBlLnR3aWNlMkQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYodGhpcy55LnRvQmlnSW50ZWdlcigpLnNpZ251bSgpPT0wKXtyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBiPXRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTt2YXIgZT10aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigzKSk7dmFyIGE9dGhpcy54LnNxdWFyZSgpLm11bHRpcGx5KGUpLmFkZCh0aGlzLmN1cnZlLmEpLmRpdmlkZSh0aGlzLnkubXVsdGlwbHkoYikpO3ZhciBjPWEuc3F1YXJlKCkuc3VidHJhY3QodGhpcy54Lm11bHRpcGx5KGIpKTt2YXIgZD1hLm11bHRpcGx5KHRoaXMueC5zdWJ0cmFjdChjKSkuc3VidHJhY3QodGhpcy55KTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLGMsZCl9O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHkyRD1mdW5jdGlvbihiKXtpZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9aWYoYi5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgZz1iO3ZhciBmPWcubXVsdGlwbHkobmV3IEJpZ0ludGVnZXIoXCIzXCIpKTt2YXIgbD10aGlzLm5lZ2F0ZSgpO3ZhciBkPXRoaXM7dmFyIGM7Zm9yKGM9Zi5iaXRMZW5ndGgoKS0yO2M+MDstLWMpe2Q9ZC50d2ljZSgpO3ZhciBhPWYudGVzdEJpdChjKTt2YXIgaj1nLnRlc3RCaXQoYyk7aWYoYSE9ail7ZD1kLmFkZDJEKGE/dGhpczpsKX19cmV0dXJuIGR9O0VDUG9pbnRGcC5wcm90b3R5cGUuaXNPbkN1cnZlPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGk9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGY9dGhpcy5jdXJ2ZS5nZXRBKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9dGhpcy5jdXJ2ZS5nZXRCKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGg9dGhpcy5jdXJ2ZS5nZXRRKCk7dmFyIGU9aS5tdWx0aXBseShpKS5tb2QoaCk7dmFyIGc9ZC5tdWx0aXBseShkKS5tdWx0aXBseShkKS5hZGQoZi5tdWx0aXBseShkKSkuYWRkKGMpLm1vZChoKTtyZXR1cm4gZS5lcXVhbHMoZyl9O0VDUG9pbnRGcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIihcIit0aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygpK1wiLFwiK3RoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKCkrXCIpXCJ9O0VDUG9pbnRGcC5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLmN1cnZlLmdldFEoKTtpZih0aGlzLmlzSW5maW5pdHkoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgYXQgaW5maW5pdHkuXCIpfXZhciBhPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBiPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO2lmKGEuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxhLmNvbXBhcmVUbyhjLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk+MCl7dGhyb3cgbmV3IEVycm9yKFwieCBjb29yZGluYXRlIG91dCBvZiBib3VuZHNcIil9aWYoYi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPDB8fGIuY29tcGFyZVRvKGMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKT4wKXt0aHJvdyBuZXcgRXJyb3IoXCJ5IGNvb3JkaW5hdGUgb3V0IG9mIGJvdW5kc1wiKX1pZighdGhpcy5pc09uQ3VydmUoKSl7dGhyb3cgbmV3IEVycm9yKFwiUG9pbnQgaXMgbm90IG9uIHRoZSBjdXJ2ZS5cIil9aWYodGhpcy5tdWx0aXBseShjKS5pc0luZmluaXR5KCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIG5vdCBhIHNjYWxhciBtdWx0aXBsZSBvZiBHLlwiKX1yZXR1cm4gdHJ1ZX07XG4vKiEgTWlrZSBTYW11ZWwgKGMpIDIwMDkgfCBjb2RlLmdvb2dsZS5jb20vcC9qc29uLXNhbnMtZXZhbFxuICovXG52YXIganNvblBhcnNlPShmdW5jdGlvbigpe3ZhciBlPVwiKD86LT9cXFxcYig/OjB8WzEtOV1bMC05XSopKD86XFxcXC5bMC05XSspPyg/OltlRV1bKy1dP1swLTldKyk/XFxcXGIpXCI7dmFyIGo9Jyg/OlteXFxcXDAtXFxcXHgwOFxcXFx4MGEtXFxcXHgxZlwiXFxcXFxcXFxdfFxcXFxcXFxcKD86W1wiL1xcXFxcXFxcYmZucnRdfHVbMC05QS1GYS1mXXs0fSkpJzt2YXIgaT0nKD86XCInK2orJypcIiknO3ZhciBkPW5ldyBSZWdFeHAoXCIoPzpmYWxzZXx0cnVlfG51bGx8W1xcXFx7XFxcXH1cXFxcW1xcXFxdXXxcIitlK1wifFwiK2krXCIpXCIsXCJnXCIpO3ZhciBrPW5ldyBSZWdFeHAoXCJcXFxcXFxcXCg/OihbXnVdKXx1KC57NH0pKVwiLFwiZ1wiKTt2YXIgZz17J1wiJzonXCInLFwiL1wiOlwiL1wiLFwiXFxcXFwiOlwiXFxcXFwiLGI6XCJcXGJcIixmOlwiXFxmXCIsbjpcIlxcblwiLHI6XCJcXHJcIix0OlwiXFx0XCJ9O2Z1bmN0aW9uIGgobCxtLG4pe3JldHVybiBtP2dbbV06U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDE2KSl9dmFyIGM9bmV3IFN0cmluZyhcIlwiKTt2YXIgYT1cIlxcXFxcIjt2YXIgZj17XCJ7XCI6T2JqZWN0LFwiW1wiOkFycmF5fTt2YXIgYj1PYmplY3QuaGFzT3duUHJvcGVydHk7cmV0dXJuIGZ1bmN0aW9uKHUscSl7dmFyIHA9dS5tYXRjaChkKTt2YXIgeDt2YXIgdj1wWzBdO3ZhciBsPWZhbHNlO2lmKFwie1wiPT09dil7eD17fX1lbHNle2lmKFwiW1wiPT09dil7eD1bXX1lbHNle3g9W107bD10cnVlfX12YXIgdDt2YXIgcj1beF07Zm9yKHZhciBvPTEtbCxtPXAubGVuZ3RoO288bTsrK28pe3Y9cFtvXTt2YXIgdztzd2l0Y2godi5jaGFyQ29kZUF0KDApKXtkZWZhdWx0Onc9clswXTt3W3R8fHcubGVuZ3RoXT0rKHYpO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMzQ6dj12LnN1YnN0cmluZygxLHYubGVuZ3RoLTEpO2lmKHYuaW5kZXhPZihhKSE9PS0xKXt2PXYucmVwbGFjZShrLGgpfXc9clswXTtpZighdCl7aWYodyBpbnN0YW5jZW9mIEFycmF5KXt0PXcubGVuZ3RofWVsc2V7dD12fHxjO2JyZWFrfX13W3RdPXY7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MTp3PXJbMF07ci51bnNoaWZ0KHdbdHx8dy5sZW5ndGhdPVtdKTt0PXZvaWQgMDticmVhaztjYXNlIDkzOnIuc2hpZnQoKTticmVhaztjYXNlIDEwMjp3PXJbMF07d1t0fHx3Lmxlbmd0aF09ZmFsc2U7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTA6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPW51bGw7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMTY6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPXRydWU7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjM6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT17fSk7dD12b2lkIDA7YnJlYWs7Y2FzZSAxMjU6ci5zaGlmdCgpO2JyZWFrfX1pZihsKXtpZihyLmxlbmd0aCE9PTEpe3Rocm93IG5ldyBFcnJvcigpfXg9eFswXX1lbHNle2lmKHIubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoKX19aWYocSl7dmFyIHM9ZnVuY3Rpb24oQyxCKXt2YXIgRD1DW0JdO2lmKEQmJnR5cGVvZiBEPT09XCJvYmplY3RcIil7dmFyIG49bnVsbDtmb3IodmFyIHogaW4gRCl7aWYoYi5jYWxsKEQseikmJkQhPT1DKXt2YXIgeT1zKEQseik7aWYoeSE9PXZvaWQgMCl7RFt6XT15fWVsc2V7aWYoIW4pe249W119bi5wdXNoKHopfX19aWYobil7Zm9yKHZhciBBPW4ubGVuZ3RoOy0tQT49MDspe2RlbGV0ZSBEW25bQV1dfX19cmV0dXJuIHEuY2FsbChDLEIsRCl9O3g9cyh7XCJcIjp4fSxcIlwiKX1yZXR1cm4geH19KSgpO1xuLyohIGFzbjEtMS4wLjkuanMgKGMpIDIwMTMtMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fUtKVVIuYXNuMS5BU04xVXRpbD1uZXcgZnVuY3Rpb24oKXt0aGlzLmludGVnZXJUb0J5dGVIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9YS50b1N0cmluZygxNik7aWYoKGIubGVuZ3RoJTIpPT0xKXtiPVwiMFwiK2J9cmV0dXJuIGJ9O3RoaXMuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXg9ZnVuY3Rpb24oail7dmFyIGY9ai50b1N0cmluZygxNik7aWYoZi5zdWJzdHIoMCwxKSE9XCItXCIpe2lmKGYubGVuZ3RoJTI9PTEpe2Y9XCIwXCIrZn1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7Zj1cIjAwXCIrZn19fWVsc2V7dmFyIGE9Zi5zdWJzdHIoMSk7dmFyIGU9YS5sZW5ndGg7aWYoZSUyPT0xKXtlKz0xfWVsc2V7aWYoIWYubWF0Y2goL15bMC03XS8pKXtlKz0yfX12YXIgZz1cIlwiO2Zvcih2YXIgZD0wO2Q8ZTtkKyspe2crPVwiZlwifXZhciBjPW5ldyBCaWdJbnRlZ2VyKGcsMTYpO3ZhciBiPWMueG9yKGopLmFkZChCaWdJbnRlZ2VyLk9ORSk7Zj1iLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eLS8sXCJcIil9cmV0dXJuIGZ9O3RoaXMuZ2V0UEVNU3RyaW5nRnJvbUhleD1mdW5jdGlvbihhLGIpe3ZhciBjPUtKVVIuYXNuMTt2YXIgZj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGEpO3ZhciBkPUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGYpO3ZhciBlPWQucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7ZT1lLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVyblwiLS0tLS1CRUdJTiBcIitiK1wiLS0tLS1cXHJcXG5cIitlK1wiXFxyXFxuLS0tLS1FTkQgXCIrYitcIi0tLS0tXFxyXFxuXCJ9O3RoaXMubmV3T2JqZWN0PWZ1bmN0aW9uKGIpe3ZhciBnPUtKVVIuYXNuMTt2YXIgaz1PYmplY3Qua2V5cyhiKTtpZihrLmxlbmd0aCE9MSl7dGhyb3dcImtleSBvZiBwYXJhbSBzaGFsbCBiZSBvbmx5IG9uZS5cIn12YXIgaj1rWzBdO2lmKFwiOmJvb2w6aW50OmJpdHN0cjpvY3RzdHI6bnVsbDpvaWQ6ZW51bTp1dGY4c3RyOm51bXN0cjpwcm5zdHI6dGVsc3RyOmlhNXN0cjp1dGN0aW1lOmdlbnRpbWU6c2VxOnNldDp0YWc6XCIuaW5kZXhPZihcIjpcIitqK1wiOlwiKT09LTEpe3Rocm93XCJ1bmRlZmluZWQga2V5OiBcIitqfWlmKGo9PVwiYm9vbFwiKXtyZXR1cm4gbmV3IGcuREVSQm9vbGVhbihiW2pdKX1pZihqPT1cImludFwiKXtyZXR1cm4gbmV3IGcuREVSSW50ZWdlcihiW2pdKX1pZihqPT1cImJpdHN0clwiKXtyZXR1cm4gbmV3IGcuREVSQml0U3RyaW5nKGJbal0pfWlmKGo9PVwib2N0c3RyXCIpe3JldHVybiBuZXcgZy5ERVJPY3RldFN0cmluZyhiW2pdKX1pZihqPT1cIm51bGxcIil7cmV0dXJuIG5ldyBnLkRFUk51bGwoYltqXSl9aWYoaj09XCJvaWRcIil7cmV0dXJuIG5ldyBnLkRFUk9iamVjdElkZW50aWZpZXIoYltqXSl9aWYoaj09XCJlbnVtXCIpe3JldHVybiBuZXcgZy5ERVJFbnVtZXJhdGVkKGJbal0pfWlmKGo9PVwidXRmOHN0clwiKXtyZXR1cm4gbmV3IGcuREVSVVRGOFN0cmluZyhiW2pdKX1pZihqPT1cIm51bXN0clwiKXtyZXR1cm4gbmV3IGcuREVSTnVtZXJpY1N0cmluZyhiW2pdKX1pZihqPT1cInBybnN0clwiKXtyZXR1cm4gbmV3IGcuREVSUHJpbnRhYmxlU3RyaW5nKGJbal0pfWlmKGo9PVwidGVsc3RyXCIpe3JldHVybiBuZXcgZy5ERVJUZWxldGV4U3RyaW5nKGJbal0pfWlmKGo9PVwiaWE1c3RyXCIpe3JldHVybiBuZXcgZy5ERVJJQTVTdHJpbmcoYltqXSl9aWYoaj09XCJ1dGN0aW1lXCIpe3JldHVybiBuZXcgZy5ERVJVVENUaW1lKGJbal0pfWlmKGo9PVwiZ2VudGltZVwiKXtyZXR1cm4gbmV3IGcuREVSR2VuZXJhbGl6ZWRUaW1lKGJbal0pfWlmKGo9PVwic2VxXCIpe3ZhciBtPWJbal07dmFyIGg9W107Zm9yKHZhciBlPTA7ZTxtLmxlbmd0aDtlKyspe3ZhciBsPWcuQVNOMVV0aWwubmV3T2JqZWN0KG1bZV0pO2gucHVzaChsKX1yZXR1cm4gbmV3IGcuREVSU2VxdWVuY2Uoe2FycmF5Omh9KX1pZihqPT1cInNldFwiKXt2YXIgbT1iW2pdO3ZhciBoPVtdO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgbD1nLkFTTjFVdGlsLm5ld09iamVjdChtW2VdKTtoLnB1c2gobCl9cmV0dXJuIG5ldyBnLkRFUlNldCh7YXJyYXk6aH0pfWlmKGo9PVwidGFnXCIpe3ZhciBjPWJbal07aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGMpPT09XCJbb2JqZWN0IEFycmF5XVwiJiZjLmxlbmd0aD09Myl7dmFyIGQ9Zy5BU04xVXRpbC5uZXdPYmplY3QoY1syXSk7cmV0dXJuIG5ldyBnLkRFUlRhZ2dlZE9iamVjdCh7dGFnOmNbMF0sZXhwbGljaXQ6Y1sxXSxvYmo6ZH0pfWVsc2V7dmFyIGY9e307aWYoYy5leHBsaWNpdCE9PXVuZGVmaW5lZCl7Zi5leHBsaWNpdD1jLmV4cGxpY2l0fWlmKGMudGFnIT09dW5kZWZpbmVkKXtmLnRhZz1jLnRhZ31pZihjLm9iaj09PXVuZGVmaW5lZCl7dGhyb3dcIm9iaiBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yICd0YWcnLlwifWYub2JqPWcuQVNOMVV0aWwubmV3T2JqZWN0KGMub2JqKTtyZXR1cm4gbmV3IGcuREVSVGFnZ2VkT2JqZWN0KGYpfX19O3RoaXMuanNvblRvQVNOMUhFWD1mdW5jdGlvbihiKXt2YXIgYT10aGlzLm5ld09iamVjdChiKTtyZXR1cm4gYS5nZXRFbmNvZGVkSGV4KCl9fTtLSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQ9ZnVuY3Rpb24oYSl7dmFyIGo9XCJcIjt2YXIgaz1wYXJzZUludChhLnN1YnN0cigwLDIpLDE2KTt2YXIgZD1NYXRoLmZsb29yKGsvNDApO3ZhciBjPWslNDA7dmFyIGo9ZCtcIi5cIitjO3ZhciBlPVwiXCI7Zm9yKHZhciBmPTI7ZjxhLmxlbmd0aDtmKz0yKXt2YXIgZz1wYXJzZUludChhLnN1YnN0cihmLDIpLDE2KTt2YXIgaD0oXCIwMDAwMDAwMFwiK2cudG9TdHJpbmcoMikpLnNsaWNlKC04KTtlPWUraC5zdWJzdHIoMSw3KTtpZihoLnN1YnN0cigwLDEpPT1cIjBcIil7dmFyIGI9bmV3IEJpZ0ludGVnZXIoZSwyKTtqPWorXCIuXCIrYi50b1N0cmluZygxMCk7ZT1cIlwifX1yZXR1cm4gan07S0pVUi5hc24xLkFTTjFVdGlsLm9pZEludFRvSGV4PWZ1bmN0aW9uKGYpe3ZhciBlPWZ1bmN0aW9uKGEpe3ZhciBrPWEudG9TdHJpbmcoMTYpO2lmKGsubGVuZ3RoPT0xKXtrPVwiMFwiK2t9cmV0dXJuIGt9O3ZhciBkPWZ1bmN0aW9uKG8pe3ZhciBuPVwiXCI7dmFyIGs9bmV3IEJpZ0ludGVnZXIobywxMCk7dmFyIGE9ay50b1N0cmluZygyKTt2YXIgbD03LWEubGVuZ3RoJTc7aWYobD09Nyl7bD0wfXZhciBxPVwiXCI7Zm9yKHZhciBtPTA7bTxsO20rKyl7cSs9XCIwXCJ9YT1xK2E7Zm9yKHZhciBtPTA7bTxhLmxlbmd0aC0xO20rPTcpe3ZhciBwPWEuc3Vic3RyKG0sNyk7aWYobSE9YS5sZW5ndGgtNyl7cD1cIjFcIitwfW4rPWUocGFyc2VJbnQocCwyKSl9cmV0dXJuIG59O2lmKCFmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitmfXZhciBnPVwiXCI7dmFyIGI9Zi5zcGxpdChcIi5cIik7dmFyIGo9cGFyc2VJbnQoYlswXSkqNDArcGFyc2VJbnQoYlsxXSk7Zys9ZShqKTtiLnNwbGljZSgwLDIpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtnKz1kKGJbY10pfXJldHVybiBnfTtLSlVSLmFzbjEuQVNOMU9iamVjdD1mdW5jdGlvbigpe3ZhciBjPXRydWU7dmFyIGI9bnVsbDt2YXIgZD1cIjAwXCI7dmFyIGU9XCIwMFwiO3ZhciBhPVwiXCI7dGhpcy5nZXRMZW5ndGhIZXhGcm9tVmFsdWU9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVj09XCJ1bmRlZmluZWRcInx8dGhpcy5oVj09bnVsbCl7dGhyb3dcInRoaXMuaFYgaXMgbnVsbCBvciB1bmRlZmluZWQuXCJ9aWYodGhpcy5oVi5sZW5ndGglMj09MSl7dGhyb3dcInZhbHVlIGhleCBtdXN0IGJlIGV2ZW4gbGVuZ3RoOiBuPVwiK2EubGVuZ3RoK1wiLHY9XCIrdGhpcy5oVn12YXIgaT10aGlzLmhWLmxlbmd0aC8yO3ZhciBoPWkudG9TdHJpbmcoMTYpO2lmKGgubGVuZ3RoJTI9PTEpe2g9XCIwXCIraH1pZihpPDEyOCl7cmV0dXJuIGh9ZWxzZXt2YXIgZz1oLmxlbmd0aC8yO2lmKGc+MTUpe3Rocm93XCJBU04uMSBsZW5ndGggdG9vIGxvbmcgdG8gcmVwcmVzZW50IGJ5IDh4OiBuID0gXCIraS50b1N0cmluZygxNil9dmFyIGY9MTI4K2c7cmV0dXJuIGYudG9TdHJpbmcoMTYpK2h9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmhUTFY9PW51bGx8fHRoaXMuaXNNb2RpZmllZCl7dGhpcy5oVj10aGlzLmdldEZyZXNoVmFsdWVIZXgoKTt0aGlzLmhMPXRoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlKCk7dGhpcy5oVExWPXRoaXMuaFQrdGhpcy5oTCt0aGlzLmhWO3RoaXMuaXNNb2RpZmllZD1mYWxzZX1yZXR1cm4gdGhpcy5oVExWfTt0aGlzLmdldFZhbHVlSGV4PWZ1bmN0aW9uKCl7dGhpcy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFZ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVyblwiXCJ9fTtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmc9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLnNldFN0cmluZ0hleD1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWR9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCIpe3RoaXMuc2V0U3RyaW5nKGMpfWVsc2V7aWYodHlwZW9mIGMuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZyhjLnN0cil9ZWxzZXtpZih0eXBlb2YgYy5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0U3RyaW5nSGV4KGMuaGV4KX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5sb2NhbERhdGVUb1VUQz1mdW5jdGlvbihmKXt1dGM9Zi5nZXRUaW1lKCkrKGYuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMCk7dmFyIGU9bmV3IERhdGUodXRjKTtyZXR1cm4gZX07dGhpcy5mb3JtYXREYXRlPWZ1bmN0aW9uKG0sbyxlKXt2YXIgZz10aGlzLnplcm9QYWRkaW5nO3ZhciBuPXRoaXMubG9jYWxEYXRlVG9VVEMobSk7dmFyIHA9U3RyaW5nKG4uZ2V0RnVsbFllYXIoKSk7aWYobz09XCJ1dGNcIil7cD1wLnN1YnN0cigyLDIpfXZhciBsPWcoU3RyaW5nKG4uZ2V0TW9udGgoKSsxKSwyKTt2YXIgcT1nKFN0cmluZyhuLmdldERhdGUoKSksMik7dmFyIGg9ZyhTdHJpbmcobi5nZXRIb3VycygpKSwyKTt2YXIgaT1nKFN0cmluZyhuLmdldE1pbnV0ZXMoKSksMik7dmFyIGo9ZyhTdHJpbmcobi5nZXRTZWNvbmRzKCkpLDIpO3ZhciByPXArbCtxK2graStqO2lmKGU9PT10cnVlKXt2YXIgZj1uLmdldE1pbGxpc2Vjb25kcygpO2lmKGYhPTApe3ZhciBrPWcoU3RyaW5nKGYpLDMpO2s9ay5yZXBsYWNlKC9bMF0rJC8sXCJcIik7cj1yK1wiLlwiK2t9fXJldHVybiByK1wiWlwifTt0aGlzLnplcm9QYWRkaW5nPWZ1bmN0aW9uKGUsZCl7aWYoZS5sZW5ndGg+PWQpe3JldHVybiBlfXJldHVybiBuZXcgQXJyYXkoZC1lLmxlbmd0aCsxKS5qb2luKFwiMFwiKStlfTt0aGlzLmdldFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O3RoaXMuc2V0U3RyaW5nPWZ1bmN0aW9uKGQpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1kO3RoaXMuaFY9c3RvaGV4KGQpfTt0aGlzLnNldEJ5RGF0ZVZhbHVlPWZ1bmN0aW9uKGgsaixlLGQsZixnKXt2YXIgaT1uZXcgRGF0ZShEYXRlLlVUQyhoLGotMSxlLGQsZixnLDApKTt0aGlzLnNldEJ5RGF0ZShpKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLnNldEJ5QVNOMU9iamVjdEFycmF5PWZ1bmN0aW9uKGMpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuYXNuMUFycmF5PWN9O3RoaXMuYXBwZW5kQVNOMU9iamVjdD1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpfTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUFycmF5PWIuYXJyYXl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkJvb2xlYW49ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSQm9vbGVhbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAxXCI7dGhpcy5oVExWPVwiMDEwMWZmXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJCb29sZWFuLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSSW50ZWdlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSSW50ZWdlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAyXCI7dGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYil9O3RoaXMuc2V0QnlJbnRlZ2VyPWZ1bmN0aW9uKGMpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKFN0cmluZyhjKSwxMCk7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYil9O3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVj1ifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmJpZ2ludCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYS5iaWdpbnQpfWVsc2V7aWYodHlwZW9mIGFbXCJpbnRcIl0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGFbXCJpbnRcIl0pfWVsc2V7aWYodHlwZW9mIGE9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlJbnRlZ2VyKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGEuaGV4KX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSW50ZWdlcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkJpdFN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSQml0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDNcIjt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cz1mdW5jdGlvbihiKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPWJ9O3RoaXMuc2V0VW51c2VkQml0c0FuZEhleFZhbHVlPWZ1bmN0aW9uKGIsZCl7aWYoYjwwfHw3PGIpe3Rocm93XCJ1bnVzZWQgYml0cyBzaGFsbCBiZSBmcm9tIDAgdG8gNzogdSA9IFwiK2J9dmFyIGM9XCIwXCIrYjt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPWMrZH07dGhpcy5zZXRCeUJpbmFyeVN0cmluZz1mdW5jdGlvbihlKXtlPWUucmVwbGFjZSgvMCskLyxcIlwiKTt2YXIgZj04LWUubGVuZ3RoJTg7aWYoZj09OCl7Zj0wfWZvcih2YXIgZz0wO2c8PWY7ZysrKXtlKz1cIjBcIn12YXIgaj1cIlwiO2Zvcih2YXIgZz0wO2c8ZS5sZW5ndGgtMTtnKz04KXt2YXIgZD1lLnN1YnN0cihnLDgpO3ZhciBjPXBhcnNlSW50KGQsMikudG9TdHJpbmcoMTYpO2lmKGMubGVuZ3RoPT0xKXtjPVwiMFwiK2N9ais9Y310aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmhWPVwiMFwiK2Yran07dGhpcy5zZXRCeUJvb2xlYW5BcnJheT1mdW5jdGlvbihkKXt2YXIgYz1cIlwiO2Zvcih2YXIgYj0wO2I8ZC5sZW5ndGg7YisrKXtpZihkW2JdPT10cnVlKXtjKz1cIjFcIn1lbHNle2MrPVwiMFwifX10aGlzLnNldEJ5QmluYXJ5U3RyaW5nKGMpfTt0aGlzLm5ld0ZhbHNlQXJyYXk9ZnVuY3Rpb24oZCl7dmFyIGI9bmV3IEFycmF5KGQpO2Zvcih2YXIgYz0wO2M8ZDtjKyspe2JbY109ZmFsc2V9cmV0dXJuIGJ9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGE9PVwic3RyaW5nXCImJmEudG9Mb3dlckNhc2UoKS5tYXRjaCgvXlswLTlhLWZdKyQvKSl7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHMoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGEuaGV4KX1lbHNle2lmKHR5cGVvZiBhLmJpbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhhLmJpbil9ZWxzZXtpZih0eXBlb2YgYS5hcnJheSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUJvb2xlYW5BcnJheShhLmFycmF5KX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQml0U3RyaW5nLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIwNFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nKTtLSlVSLmFzbjEuREVSTnVsbD1mdW5jdGlvbigpe0tKVVIuYXNuMS5ERVJOdWxsLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiMDVcIjt0aGlzLmhUTFY9XCIwNTAwXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJOdWxsLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcj1mdW5jdGlvbihjKXt2YXIgYj1mdW5jdGlvbihkKXt2YXIgZT1kLnRvU3RyaW5nKDE2KTtpZihlLmxlbmd0aD09MSl7ZT1cIjBcIitlfXJldHVybiBlfTt2YXIgYT1mdW5jdGlvbihrKXt2YXIgaj1cIlwiO3ZhciBlPW5ldyBCaWdJbnRlZ2VyKGssMTApO3ZhciBkPWUudG9TdHJpbmcoMik7dmFyIGY9Ny1kLmxlbmd0aCU3O2lmKGY9PTcpe2Y9MH12YXIgbT1cIlwiO2Zvcih2YXIgZz0wO2c8ZjtnKyspe20rPVwiMFwifWQ9bStkO2Zvcih2YXIgZz0wO2c8ZC5sZW5ndGgtMTtnKz03KXt2YXIgbD1kLnN1YnN0cihnLDcpO2lmKGchPWQubGVuZ3RoLTcpe2w9XCIxXCIrbH1qKz1iKHBhcnNlSW50KGwsMikpfXJldHVybiBqfTtLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA2XCI7dGhpcy5zZXRWYWx1ZUhleD1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9bnVsbDt0aGlzLmhWPWR9O3RoaXMuc2V0VmFsdWVPaWRTdHJpbmc9ZnVuY3Rpb24oZil7aWYoIWYubWF0Y2goL15bMC05Ll0rJC8pKXt0aHJvd1wibWFsZm9ybWVkIG9pZCBzdHJpbmc6IFwiK2Z9dmFyIGc9XCJcIjt2YXIgZD1mLnNwbGl0KFwiLlwiKTt2YXIgaj1wYXJzZUludChkWzBdKSo0MCtwYXJzZUludChkWzFdKTtnKz1iKGopO2Quc3BsaWNlKDAsMik7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2crPWEoZFtlXSl9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1nfTt0aGlzLnNldFZhbHVlTmFtZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgS0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtlXSE9XCJ1bmRlZmluZWRcIil7dmFyIGQ9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtlXTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGQpfWVsc2V7dGhyb3dcIkRFUk9iamVjdElkZW50aWZpZXIgb2lkTmFtZSB1bmRlZmluZWQ6IFwiK2V9fTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiJiZjLm1hdGNoKC9eWzAtMl0uWzAtOS5dKyQvKSl7dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhjKX1lbHNle2lmKEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbY10hPT11bmRlZmluZWQpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoS0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdFtjXSl9ZWxzZXtpZih0eXBlb2YgYy5vaWQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYy5vaWQpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlSGV4KGMuaGV4KX1lbHNle2lmKHR5cGVvZiBjLm5hbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVOYW1lKGMubmFtZSl9fX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuREVSRW51bWVyYXRlZD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSRW51bWVyYXRlZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjBhXCI7dGhpcy5zZXRCeUJpZ0ludGVnZXI9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoYil9O3RoaXMuc2V0QnlJbnRlZ2VyPWZ1bmN0aW9uKGMpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKFN0cmluZyhjKSwxMCk7dGhpcy5zZXRCeUJpZ0ludGVnZXIoYil9O3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oYil7dGhpcy5oVj1ifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSRW51bWVyYXRlZCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUlVURjhTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlVURjhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjBjXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUk51bWVyaWNTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjEyXCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxM1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSUHJpbnRhYmxlU3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlRlbGV0ZXhTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE0XCJ9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUklBNVN0cmluZz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSSUE1U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSSUE1U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUlVUQ1RpbWU9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlVUQ1RpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE3XCI7dGhpcy5zZXRCeURhdGU9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5kYXRlPWI7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJ1dGNcIik7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuZGF0ZT09XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHRoaXMucz09XCJ1bmRlZmluZWRcIil7dGhpcy5kYXRlPW5ldyBEYXRlKCk7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJ1dGNcIik7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX1yZXR1cm4gdGhpcy5oVn07aWYoYSE9PXVuZGVmaW5lZCl7aWYoYS5zdHIhPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nKGEuc3RyKX1lbHNle2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLm1hdGNoKC9eWzAtOV17MTJ9WiQvKSl7dGhpcy5zZXRTdHJpbmcoYSl9ZWxzZXtpZihhLmhleCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmdIZXgoYS5oZXgpfWVsc2V7aWYoYS5kYXRlIT09dW5kZWZpbmVkKXt0aGlzLnNldEJ5RGF0ZShhLmRhdGUpfX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJVVENUaW1lLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWUpO0tKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWU9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMThcIjt0aGlzLndpdGhNaWxsaXM9ZmFsc2U7dGhpcy5zZXRCeURhdGU9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5kYXRlPWI7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJnZW5cIix0aGlzLndpdGhNaWxsaXMpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2lmKHRoaXMuZGF0ZT09PXVuZGVmaW5lZCYmdGhpcy5zPT09dW5kZWZpbmVkKXt0aGlzLmRhdGU9bmV3IERhdGUoKTt0aGlzLnM9dGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSxcImdlblwiLHRoaXMud2l0aE1pbGxpcyk7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX1yZXR1cm4gdGhpcy5oVn07aWYoYSE9PXVuZGVmaW5lZCl7aWYoYS5zdHIhPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nKGEuc3RyKX1lbHNle2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLm1hdGNoKC9eWzAtOV17MTR9WiQvKSl7dGhpcy5zZXRTdHJpbmcoYSl9ZWxzZXtpZihhLmhleCE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdHJpbmdIZXgoYS5oZXgpfWVsc2V7aWYoYS5kYXRlIT09dW5kZWZpbmVkKXt0aGlzLnNldEJ5RGF0ZShhLmRhdGUpfX19fWlmKGEubWlsbGlzPT09dHJ1ZSl7dGhpcy53aXRoTWlsbGlzPXRydWV9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lKTtLSlVSLmFzbjEuREVSU2VxdWVuY2U9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlNlcXVlbmNlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIzMFwiO3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBjPVwiXCI7Zm9yKHZhciBiPTA7Yjx0aGlzLmFzbjFBcnJheS5sZW5ndGg7YisrKXt2YXIgZD10aGlzLmFzbjFBcnJheVtiXTtjKz1kLmdldEVuY29kZWRIZXgoKX10aGlzLmhWPWM7cmV0dXJuIHRoaXMuaFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSU2VxdWVuY2UsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCk7S0pVUi5hc24xLkRFUlNldD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSU2V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIzMVwiO3RoaXMuc29ydEZsYWc9dHJ1ZTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPHRoaXMuYXNuMUFycmF5Lmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuYXNuMUFycmF5W2NdO2IucHVzaChkLmdldEVuY29kZWRIZXgoKSl9aWYodGhpcy5zb3J0RmxhZz09dHJ1ZSl7Yi5zb3J0KCl9dGhpcy5oVj1iLmpvaW4oXCJcIik7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5zb3J0ZmxhZyE9XCJ1bmRlZmluZWRcIiYmYS5zb3J0ZmxhZz09ZmFsc2Upe3RoaXMuc29ydEZsYWc9ZmFsc2V9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlNldCxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJ1Y3R1cmVkKTtLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCJhMFwiO3RoaXMuaFY9XCJcIjt0aGlzLmlzRXhwbGljaXQ9dHJ1ZTt0aGlzLmFzbjFPYmplY3Q9bnVsbDt0aGlzLnNldEFTTjFPYmplY3Q9ZnVuY3Rpb24oYixjLGQpe3RoaXMuaFQ9Yzt0aGlzLmlzRXhwbGljaXQ9Yjt0aGlzLmFzbjFPYmplY3Q9ZDtpZih0aGlzLmlzRXhwbGljaXQpe3RoaXMuaFY9dGhpcy5hc24xT2JqZWN0LmdldEVuY29kZWRIZXgoKTt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZX1lbHNle3RoaXMuaFY9bnVsbDt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPXRoaXMuaFRMVi5yZXBsYWNlKC9eLi4vLGMpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX19O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEudGFnIT1cInVuZGVmaW5lZFwiKXt0aGlzLmhUPWEudGFnfWlmKHR5cGVvZiBhLmV4cGxpY2l0IT1cInVuZGVmaW5lZFwiKXt0aGlzLmlzRXhwbGljaXQ9YS5leHBsaWNpdH1pZih0eXBlb2YgYS5vYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMU9iamVjdD1hLm9iajt0aGlzLnNldEFTTjFPYmplY3QodGhpcy5pc0V4cGxpY2l0LHRoaXMuaFQsdGhpcy5hc24xT2JqZWN0KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtcbi8qISBhc24xaGV4LTEuMS42LmpzIChjKSAyMDEyLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIEFTTjFIRVg9bmV3IGZ1bmN0aW9uKCl7dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqPWZ1bmN0aW9uKGIsYyl7aWYoYi5zdWJzdHJpbmcoYysyLGMrMykhPVwiOFwiKXtyZXR1cm4gMX12YXIgYT1wYXJzZUludChiLnN1YnN0cmluZyhjKzMsYys0KSk7aWYoYT09MCl7cmV0dXJuIC0xfWlmKDA8YSYmYTwxMCl7cmV0dXJuIGErMX1yZXR1cm4gLTJ9O3RoaXMuZ2V0SGV4T2ZMX0F0T2JqPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqKGIsYyk7aWYoYTwxKXtyZXR1cm5cIlwifXJldHVybiBiLnN1YnN0cmluZyhjKzIsYysyK2EqMil9O3RoaXMuZ2V0SW50T2ZMX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRIZXhPZkxfQXRPYmooYyxkKTtpZihiPT1cIlwiKXtyZXR1cm4gLTF9dmFyIGE7aWYocGFyc2VJbnQoYi5zdWJzdHJpbmcoMCwxKSk8OCl7YT1uZXcgQmlnSW50ZWdlcihiLDE2KX1lbHNle2E9bmV3IEJpZ0ludGVnZXIoYi5zdWJzdHJpbmcoMiksMTYpfXJldHVybiBhLmludFZhbHVlKCl9O3RoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmo9ZnVuY3Rpb24oYixjKXt2YXIgYT10aGlzLmdldEJ5dGVMZW5ndGhPZkxfQXRPYmooYixjKTtpZihhPDApe3JldHVybiBhfXJldHVybiBjKyhhKzEpKjJ9O3RoaXMuZ2V0SGV4T2ZWX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihjLGQpO3ZhciBhPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGMsZCk7cmV0dXJuIGMuc3Vic3RyaW5nKGIsYithKjIpfTt0aGlzLmdldEhleE9mVExWX0F0T2JqPWZ1bmN0aW9uKGMsZSl7dmFyIGI9Yy5zdWJzdHIoZSwyKTt2YXIgZD10aGlzLmdldEhleE9mTF9BdE9iaihjLGUpO3ZhciBhPXRoaXMuZ2V0SGV4T2ZWX0F0T2JqKGMsZSk7cmV0dXJuIGIrZCthfTt0aGlzLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmo9ZnVuY3Rpb24oYyxkKXt2YXIgYj10aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGMsZCk7dmFyIGE9dGhpcy5nZXRJbnRPZkxfQXRPYmooYyxkKTtyZXR1cm4gYithKjJ9O3RoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqPWZ1bmN0aW9uKGYsail7dmFyIGM9bmV3IEFycmF5KCk7dmFyIGk9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihmLGopO2MucHVzaChpKTt2YXIgYj10aGlzLmdldEludE9mTF9BdE9iaihmLGopO3ZhciBnPWk7dmFyIGQ9MDt3aGlsZSgxKXt2YXIgZT10aGlzLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZixnKTtpZihlPT1udWxsfHwoZS1pPj0oYioyKSkpe2JyZWFrfWlmKGQ+PTIwMCl7YnJlYWt9Yy5wdXNoKGUpO2c9ZTtkKyt9cmV0dXJuIGN9O3RoaXMuZ2V0TnRoQ2hpbGRJbmRleF9BdE9iaj1mdW5jdGlvbihkLGIsZSl7dmFyIGM9dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxiKTtyZXR1cm4gY1tlXX07dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdD1mdW5jdGlvbihlLGQsYyl7aWYoYy5sZW5ndGg9PTApe3JldHVybiBkfXZhciBmPWMuc2hpZnQoKTt2YXIgYj10aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGQpO3JldHVybiB0aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGUsYltmXSxjKX07dGhpcy5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3Q9ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO3JldHVybiB0aGlzLmdldEhleE9mVExWX0F0T2JqKGQsYSl9O3RoaXMuZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdD1mdW5jdGlvbihkLGMsYil7dmFyIGE9dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLGMsYik7cmV0dXJuIHRoaXMuZ2V0SGV4T2ZWX0F0T2JqKGQsYSl9fTtBU04xSEVYLmdldFZieUxpc3Q9ZnVuY3Rpb24oZCxjLGIsZSl7dmFyIGE9dGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLGMsYik7aWYoYT09PXVuZGVmaW5lZCl7dGhyb3dcImNhbid0IGZpbmQgbnRoTGlzdCBvYmplY3RcIn1pZihlIT09dW5kZWZpbmVkKXtpZihkLnN1YnN0cihhLDIpIT1lKXt0aHJvd1wiY2hlY2tpbmcgdGFnIGRvZXNuJ3QgbWF0Y2g6IFwiK2Quc3Vic3RyKGEsMikrXCIhPVwiK2V9fXJldHVybiB0aGlzLmdldEhleE9mVl9BdE9iaihkLGEpfTtBU04xSEVYLmhleHRvb2lkc3RyPWZ1bmN0aW9uKGUpe3ZhciBoPWZ1bmN0aW9uKGIsYSl7aWYoYi5sZW5ndGg+PWEpe3JldHVybiBifXJldHVybiBuZXcgQXJyYXkoYS1iLmxlbmd0aCsxKS5qb2luKFwiMFwiKStifTt2YXIgbD1bXTt2YXIgbz1lLnN1YnN0cigwLDIpO3ZhciBmPXBhcnNlSW50KG8sMTYpO2xbMF09bmV3IFN0cmluZyhNYXRoLmZsb29yKGYvNDApKTtsWzFdPW5ldyBTdHJpbmcoZiU0MCk7dmFyIG09ZS5zdWJzdHIoMik7dmFyIGs9W107Zm9yKHZhciBnPTA7ZzxtLmxlbmd0aC8yO2crKyl7ay5wdXNoKHBhcnNlSW50KG0uc3Vic3RyKGcqMiwyKSwxNikpfXZhciBqPVtdO3ZhciBkPVwiXCI7Zm9yKHZhciBnPTA7ZzxrLmxlbmd0aDtnKyspe2lmKGtbZ10mMTI4KXtkPWQraCgoa1tnXSYxMjcpLnRvU3RyaW5nKDIpLDcpfWVsc2V7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KTtqLnB1c2gobmV3IFN0cmluZyhwYXJzZUludChkLDIpKSk7ZD1cIlwifX12YXIgbj1sLmpvaW4oXCIuXCIpO2lmKGoubGVuZ3RoPjApe249bitcIi5cIitqLmpvaW4oXCIuXCIpfXJldHVybiBufTtBU04xSEVYLmR1bXA9ZnVuY3Rpb24oZSxjLGssZyl7dmFyIG89ZnVuY3Rpb24odyxpKXtpZih3Lmxlbmd0aDw9aSoyKXtyZXR1cm4gd31lbHNle3ZhciB2PXcuc3Vic3RyKDAsaSkrXCIuLih0b3RhbCBcIit3Lmxlbmd0aC8yK1wiYnl0ZXMpLi5cIit3LnN1YnN0cih3Lmxlbmd0aC1pLGkpO3JldHVybiB2fX07aWYoYz09PXVuZGVmaW5lZCl7Yz17b21taXRfbG9uZ19vY3RldDozMn19aWYoaz09PXVuZGVmaW5lZCl7az0wfWlmKGc9PT11bmRlZmluZWQpe2c9XCJcIn12YXIgcj1jLm9tbWl0X2xvbmdfb2N0ZXQ7aWYoZS5zdWJzdHIoaywyKT09XCIwMVwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKGg9PVwiMDBcIil7cmV0dXJuIGcrXCJCT09MRUFOIEZBTFNFXFxuXCJ9ZWxzZXtyZXR1cm4gZytcIkJPT0xFQU4gVFJVRVxcblwifX1pZihlLnN1YnN0cihrLDIpPT1cIjAyXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7cmV0dXJuIGcrXCJJTlRFR0VSIFwiK28oaCxyKStcIlxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMDNcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtyZXR1cm4gZytcIkJJVFNUUklORyBcIitvKGgscikrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjA0XCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7aWYoQVNOMUhFWC5pc0FTTjFIRVgoaCkpe3ZhciBqPWcrXCJPQ1RFVFNUUklORywgZW5jYXBzdWxhdGVzXFxuXCI7aj1qK0FTTjFIRVguZHVtcChoLGMsMCxnK1wiICBcIik7cmV0dXJuIGp9ZWxzZXtyZXR1cm4gZytcIk9DVEVUU1RSSU5HIFwiK28oaCxyKStcIlxcblwifX1pZihlLnN1YnN0cihrLDIpPT1cIjA1XCIpe3JldHVybiBnK1wiTlVMTFxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMDZcIil7dmFyIGw9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQobCk7dmFyIG49S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3ZhciBiPWEucmVwbGFjZSgvXFwuL2csXCIgXCIpO2lmKG4hPVwiXCIpe3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciBcIituK1wiIChcIitiK1wiKVxcblwifWVsc2V7cmV0dXJuIGcrXCJPYmplY3RJZGVudGlmaWVyIChcIitiK1wiKVxcblwifX1pZihlLnN1YnN0cihrLDIpPT1cIjBjXCIpe3JldHVybiBnK1wiVVRGOFN0cmluZyAnXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiJ1xcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMTNcIil7cmV0dXJuIGcrXCJQcmludGFibGVTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE0XCIpe3JldHVybiBnK1wiVGVsZXRleFN0cmluZyAnXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiJ1xcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMTZcIil7cmV0dXJuIGcrXCJJQTVTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE3XCIpe3JldHVybiBnK1wiVVRDVGltZSBcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE4XCIpe3JldHVybiBnK1wiR2VuZXJhbGl6ZWRUaW1lIFwiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIlxcblwifWlmKGUuc3Vic3RyKGssMik9PVwiMzBcIil7aWYoZS5zdWJzdHIoayw0KT09XCIzMDAwXCIpe3JldHVybiBnK1wiU0VRVUVOQ0Uge31cXG5cIn12YXIgaj1nK1wiU0VRVUVOQ0VcXG5cIjt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGspO3ZhciBmPWM7aWYoKGQubGVuZ3RoPT0yfHxkLmxlbmd0aD09MykmJmUuc3Vic3RyKGRbMF0sMik9PVwiMDZcIiYmZS5zdWJzdHIoZFtkLmxlbmd0aC0xXSwyKT09XCIwNFwiKXt2YXIgdD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGRbMF0pO3ZhciBhPUtKVVIuYXNuMS5BU04xVXRpbC5vaWRIZXhUb0ludCh0KTt2YXIgbj1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYSk7dmFyIHA9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjKSk7cC54NTA5RXh0TmFtZT1uO2Y9cH1mb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGYsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9aWYoZS5zdWJzdHIoaywyKT09XCIzMVwiKXt2YXIgaj1nK1wiU0VUXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGMsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9dmFyIHU9cGFyc2VJbnQoZS5zdWJzdHIoaywyKSwxNik7aWYoKHUmMTI4KSE9MCl7dmFyIG09dSYzMTtpZigodSYzMikhPTApe3ZhciBqPWcrXCJbXCIrbStcIl1cXG5cIjt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLGspO2Zvcih2YXIgcT0wO3E8ZC5sZW5ndGg7cSsrKXtqPWorQVNOMUhFWC5kdW1wKGUsYyxkW3FdLGcrXCIgIFwiKX1yZXR1cm4gan1lbHNle3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7aWYoaC5zdWJzdHIoMCw4KT09XCI2ODc0NzQ3MFwiKXtoPWhleHRvdXRmOChoKX1pZihjLng1MDlFeHROYW1lPT09XCJzdWJqZWN0QWx0TmFtZVwiJiZtPT0yKXtoPWhleHRvdXRmOChoKX12YXIgaj1nK1wiW1wiK20rXCJdIFwiK2grXCJcXG5cIjtyZXR1cm4gan19cmV0dXJuIGcrXCJVTktOT1dOKFwiK2Uuc3Vic3RyKGssMikrXCIpIFwiK0FTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykrXCJcXG5cIn07QVNOMUhFWC5pc0FTTjFIRVg9ZnVuY3Rpb24oZCl7aWYoZC5sZW5ndGglMj09MSl7cmV0dXJuIGZhbHNlfXZhciBjPUFTTjFIRVguZ2V0SW50T2ZMX0F0T2JqKGQsMCk7dmFyIGI9ZC5zdWJzdHIoMCwyKTt2YXIgZT1BU04xSEVYLmdldEhleE9mTF9BdE9iaihkLDApO3ZhciBhPWQubGVuZ3RoLWIubGVuZ3RoLWUubGVuZ3RoO2lmKGE9PWMqMil7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtcbi8qISBhc24xeDUwOS0xLjAuMTMuanMgKGMpIDIwMTMtMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjEueDUwOT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS54NTA5KXtLSlVSLmFzbjEueDUwOT17fX1LSlVSLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZT1mdW5jdGlvbihnKXtLSlVSLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3ZhciBmPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBlPW51bGw7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3M9ZnVuY3Rpb24oaSxrKXt2YXIgaD1QS0NTNVBLRVkuZ2V0RGVjcnlwdGVkS2V5SGV4KGksayk7dmFyIGo9bmV3IFJTQUtleSgpO2oucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhoKTt0aGlzLnBydktleT1qfTt0aGlzLnNpZ249ZnVuY3Rpb24oKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9dGhpcy5hc24xVEJTQ2VydC5hc24xU2lnbmF0dXJlQWxnO3NpZz1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6XCJTSEExd2l0aFJTQVwifSk7c2lnLmluaXQodGhpcy5wcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xVEJTQ2VydC5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGg9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMVRCU0NlcnQsdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9aC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLnNldFNpZ25hdHVyZUhleD1mdW5jdGlvbihoKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9dGhpcy5hc24xVEJTQ2VydC5hc24xU2lnbmF0dXJlQWxnO3RoaXMuaGV4U2lnPWg7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGk9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMVRCU0NlcnQsdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9aS5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW9kaWZpZWQ9PWZhbHNlJiZ0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9dGhyb3dcIm5vdCBzaWduZWQgeWV0XCJ9O3RoaXMuZ2V0UEVNU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGo9dGhpcy5nZXRFbmNvZGVkSGV4KCk7dmFyIGg9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShqKTt2YXIgaT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShoKTt2YXIgaz1pLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3JldHVyblwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXFxyXFxuXCIraytcIlxcclxcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cXHJcXG5cIn07aWYodHlwZW9mIGchPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBnLnRic2NlcnRvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMVRCU0NlcnQ9Zy50YnNjZXJ0b2JqfWlmKHR5cGVvZiBnLnBydmtleW9iaiE9XCJ1bmRlZmluZWRcIil7dGhpcy5wcnZLZXk9Zy5wcnZrZXlvYmp9ZWxzZXtpZih0eXBlb2YgZy5yc2FwcnZrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMucHJ2S2V5PWcucnNhcHJ2a2V5fWVsc2V7aWYoKHR5cGVvZiBnLnJzYXBydnBlbSE9XCJ1bmRlZmluZWRcIikmJih0eXBlb2YgZy5yc2FwcnZwYXMhPVwidW5kZWZpbmVkXCIpKXt0aGlzLnNldFJzYVBydktleUJ5UEVNYW5kUGFzcyhnLnJzYXBydnBlbSxnLnJzYXBydnBhcyl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5DZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGU9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuVEJTQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFWZXJzaW9uPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjJ9KX0pO3RoaXMuYXNuMVNlcmlhbE51bWJlcj1udWxsO3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1udWxsO3RoaXMuYXNuMUlzc3Vlcj1udWxsO3RoaXMuYXNuMU5vdEJlZm9yZT1udWxsO3RoaXMuYXNuMU5vdEFmdGVyPW51bGw7dGhpcy5hc24xU3ViamVjdD1udWxsO3RoaXMuYXNuMVN1YmpQS2V5PW51bGw7dGhpcy5leHRlbnNpb25zQXJyYXk9bmV3IEFycmF5KCl9O3RoaXMuc2V0U2VyaWFsTnVtYmVyQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTZXJpYWxOdW1iZXI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGIpfTt0aGlzLnNldFNpZ25hdHVyZUFsZ0J5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKGIpfTt0aGlzLnNldElzc3VlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShiKX07dGhpcy5zZXROb3RCZWZvcmVCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMU5vdEJlZm9yZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShiKX07dGhpcy5zZXROb3RBZnRlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xTm90QWZ0ZXI9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYil9O3RoaXMuc2V0U3ViamVjdEJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3ViamVjdD1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeUdldEtleT1mdW5jdGlvbihjKXt2YXIgYj1LRVlVVElMLmdldEtleShjKTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYil9O3RoaXMuYXBwZW5kRXh0ZW5zaW9uPWZ1bmN0aW9uKGIpe3RoaXMuZXh0ZW5zaW9uc0FycmF5LnB1c2goYil9O3RoaXMuYXBwZW5kRXh0ZW5zaW9uQnlOYW1lPWZ1bmN0aW9uKGQsYil7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImJhc2ljY29uc3RyYWludHNcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwia2V5dXNhZ2VcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LktleVVzYWdlKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImNybGRpc3RyaWJ1dGlvbnBvaW50c1wiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImV4dGtleXVzYWdlXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZShiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJhdXRob3JpdHlrZXlpZGVudGlmaWVyXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIGV4dGVuc2lvbiBuYW1lOiBcIitkfX19fX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuYXNuMU5vdEJlZm9yZT09bnVsbHx8dGhpcy5hc24xTm90QWZ0ZXI9PW51bGwpe3Rocm93XCJub3RCZWZvcmUgYW5kL29yIG5vdEFmdGVyIG5vdCBzZXRcIn12YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xTm90QmVmb3JlLHRoaXMuYXNuMU5vdEFmdGVyXX0pO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVmVyc2lvbik7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTZXJpYWxOdW1iZXIpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2lnbmF0dXJlQWxnKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMUlzc3Vlcik7dGhpcy5hc24xQXJyYXkucHVzaChjKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmplY3QpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3VialBLZXkpO2lmKHRoaXMuZXh0ZW5zaW9uc0FycmF5Lmxlbmd0aD4wKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmV4dGVuc2lvbnNBcnJheX0pO3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDp0cnVlLHRhZzpcImEzXCIsb2JqOmR9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGIpfXZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5FeHRlbnNpb249ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOnRoaXMub2lkfSk7dmFyIGU9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OnRoaXMuZ2V0RXh0blZhbHVlSGV4KCl9KTt2YXIgZD1uZXcgQXJyYXkoKTtkLnB1c2goZik7aWYodGhpcy5jcml0aWNhbCl7ZC5wdXNoKG5ldyBLSlVSLmFzbjEuREVSQm9vbGVhbigpKX1kLnB1c2goZSk7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZH0pO3JldHVybiBjLmdldEVuY29kZWRIZXgoKX07dGhpcy5jcml0aWNhbD1mYWxzZTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuY3JpdGljYWwhPVwidW5kZWZpbmVkXCIpe3RoaXMuY3JpdGljYWw9Yi5jcml0aWNhbH19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LktleVVzYWdlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LktleVVzYWdlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjE1XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmJpbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xRXh0blZhbHVlPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKGEpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LktleVVzYWdlLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cz1mdW5jdGlvbihjKXtLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGMpO3ZhciBhPWZhbHNlO3ZhciBiPS0xO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEFycmF5KCk7aWYodGhpcy5jQSl7ZS5wdXNoKG5ldyBLSlVSLmFzbjEuREVSQm9vbGVhbigpKX1pZih0aGlzLnBhdGhMZW4+LTEpe2UucHVzaChuZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5wYXRoTGVufSkpfXZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmFzbjFFeHRuVmFsdWU9ZDtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5vaWQ9XCIyLjUuMjkuMTlcIjt0aGlzLmNBPWZhbHNlO3RoaXMucGF0aExlbj0tMTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMuY0EhPVwidW5kZWZpbmVkXCIpe3RoaXMuY0E9Yy5jQX1pZih0eXBlb2YgYy5wYXRoTGVuIT1cInVuZGVmaW5lZFwiKXt0aGlzLnBhdGhMZW49Yy5wYXRoTGVufX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHMsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5DUkxEaXN0cmlidXRpb25Qb2ludHM9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuc2V0QnlEUEFycmF5PWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpifSl9O3RoaXMuc2V0QnlPbmVVUkk9ZnVuY3Rpb24oZSl7dmFyIGI9bmV3IEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyhbe3VyaTplfV0pO3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUoYik7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50KHtkcG9iajpkfSk7dGhpcy5zZXRCeURQQXJyYXkoW2NdKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzFcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlEUEFycmF5KGEuYXJyYXkpfWVsc2V7aWYodHlwZW9mIGEudXJpIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5T25lVVJJKGEudXJpKX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2U9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2Uuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5zZXRQdXJwb3NlQXJyYXk9ZnVuY3Rpb24oYil7dGhpcy5hc24xRXh0blZhbHVlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2UoKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKGJbY10pO3RoaXMuYXNuMUV4dG5WYWx1ZS5hcHBlbmRBU04xT2JqZWN0KGQpfX07dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzdcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UHVycG9zZUFycmF5KGEuYXJyYXkpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuYXNuMUtJRD1udWxsO3RoaXMuYXNuMUNlcnRJc3N1ZXI9bnVsbDt0aGlzLmFzbjFDZXJ0U049bnVsbDt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBBcnJheSgpO2lmKHRoaXMuYXNuMUtJRCl7Yy5wdXNoKG5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCI4MFwiLG9iajp0aGlzLmFzbjFLSUR9KSl9aWYodGhpcy5hc24xQ2VydElzc3Vlcil7Yy5wdXNoKG5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCJhMVwiLG9iajp0aGlzLmFzbjFDZXJ0SXNzdWVyfSkpfWlmKHRoaXMuYXNuMUNlcnRTTil7Yy5wdXNoKG5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6XCI4MlwiLG9iajp0aGlzLmFzbjFDZXJ0U059KSl9dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuYXNuMUV4dG5WYWx1ZT1iO3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLnNldEtJREJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xS0lEPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoYil9O3RoaXMuc2V0Q2VydElzc3VlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xQ2VydElzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0Q2VydFNOQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFDZXJ0U049bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGIpfTt0aGlzLm9pZD1cIjIuNS4yOS4zNVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5raWQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0S0lEQnlQYXJhbShhLmtpZCl9aWYodHlwZW9mIGEuaXNzdWVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldENlcnRJc3N1ZXJCeVBhcmFtKGEuaXNzdWVyKX1pZih0eXBlb2YgYS5zbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0U05CeVBhcmFtKGEuc24pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXIsS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uKTtLSlVSLmFzbjEueDUwOS5DUkw9ZnVuY3Rpb24oZil7S0pVUi5hc24xLng1MDkuQ1JMLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3ZhciBjPW51bGw7dmFyIGU9bnVsbDt2YXIgYj1udWxsO3ZhciBkPW51bGw7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3M9ZnVuY3Rpb24oaCxqKXt2YXIgZz1QS0NTNVBLRVkuZ2V0RGVjcnlwdGVkS2V5SGV4KGgsaik7dmFyIGk9bmV3IFJTQUtleSgpO2kucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhnKTt0aGlzLnJzYVBydktleT1pfTt0aGlzLnNpZ249ZnVuY3Rpb24oKXt0aGlzLmFzbjFTaWduYXR1cmVBbGc9dGhpcy5hc24xVEJTQ2VydExpc3QuYXNuMVNpZ25hdHVyZUFsZztzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOlwiU0hBMXdpdGhSU0FcIixwcm92OlwiY3J5cHRvanMvanNyc2FcIn0pO3NpZy5pbml0U2lnbih0aGlzLnJzYVBydktleSk7c2lnLnVwZGF0ZUhleCh0aGlzLmFzbjFUQlNDZXJ0TGlzdC5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMVRCU0NlcnRMaXN0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBpPXRoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBnPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoaSk7dmFyIGg9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoZyk7dmFyIGo9aC5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gWDUwOSBDUkwtLS0tLVxcclxcblwiK2orXCJcXHJcXG4tLS0tLUVORCBYNTA5IENSTC0tLS0tXFxyXFxuXCJ9O2lmKHR5cGVvZiBmIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZi50YnNvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMVRCU0NlcnRMaXN0PWYudGJzb2JqfWlmKHR5cGVvZiBmLnJzYXBydmtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5yc2FQcnZLZXk9Zi5yc2FwcnZrZXl9aWYoKHR5cGVvZiBmLnJzYXBydnBlbSE9XCJ1bmRlZmluZWRcIikmJih0eXBlb2YgZi5yc2FwcnZwYXMhPVwidW5kZWZpbmVkXCIpKXt0aGlzLnNldFJzYVBydktleUJ5UEVNYW5kUGFzcyhmLnJzYXBydnBlbSxmLnJzYXBydnBhcyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ1JMLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UQlNDZXJ0TGlzdD1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5UQlNDZXJ0TGlzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLnNldFNpZ25hdHVyZUFsZ0J5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKGMpfTt0aGlzLnNldElzc3VlckJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShjKX07dGhpcy5zZXRUaGlzVXBkYXRlQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFUaGlzVXBkYXRlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpfTt0aGlzLnNldE5leHRVcGRhdGVCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMU5leHRVcGRhdGU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYyl9O3RoaXMuYWRkUmV2b2tlZENlcnQ9ZnVuY3Rpb24oYyxkKXt2YXIgZj17fTtpZihjIT11bmRlZmluZWQmJmMhPW51bGwpe2Yuc249Y31pZihkIT11bmRlZmluZWQmJmQhPW51bGwpe2YudGltZT1kfXZhciBlPW5ldyBLSlVSLmFzbjEueDUwOS5DUkxFbnRyeShmKTt0aGlzLmFSZXZva2VkQ2VydC5wdXNoKGUpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0aGlzLmFzbjFWZXJzaW9uIT1udWxsKXt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pfXRoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2lnbmF0dXJlQWxnKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMUlzc3Vlcik7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFUaGlzVXBkYXRlKTtpZih0aGlzLmFzbjFOZXh0VXBkYXRlIT1udWxsKXt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMU5leHRVcGRhdGUpfWlmKHRoaXMuYVJldm9rZWRDZXJ0Lmxlbmd0aD4wKXt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFSZXZva2VkQ2VydH0pO3RoaXMuYXNuMUFycmF5LnB1c2goYyl9dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFWZXJzaW9uPW51bGw7dGhpcy5hc24xU2lnbmF0dXJlQWxnPW51bGw7dGhpcy5hc24xSXNzdWVyPW51bGw7dGhpcy5hc24xVGhpc1VwZGF0ZT1udWxsO3RoaXMuYXNuMU5leHRVcGRhdGU9bnVsbDt0aGlzLmFSZXZva2VkQ2VydD1uZXcgQXJyYXkoKX07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UQlNDZXJ0TGlzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuQ1JMRW50cnk9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuQ1JMRW50cnkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldENlcnRTZXJpYWw9ZnVuY3Rpb24oZCl7dGhpcy5zbj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoZCl9O3RoaXMuc2V0UmV2b2NhdGlvbkRhdGU9ZnVuY3Rpb24oZCl7dGhpcy50aW1lPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGQpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5zbix0aGlzLnRpbWVdfSk7dGhpcy5UTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMudGltZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSZXZvY2F0aW9uRGF0ZShjLnRpbWUpfWlmKHR5cGVvZiBjLnNuIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldENlcnRTZXJpYWwoYy5zbil9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ1JMRW50cnksS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5Llg1MDBOYW1lPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5Llg1MDBOYW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLnNldEJ5U3RyaW5nPWZ1bmN0aW9uKGMpe3ZhciBkPWMuc3BsaXQoXCIvXCIpO2Quc2hpZnQoKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dGhpcy5hc24xQXJyYXkucHVzaChuZXcgS0pVUi5hc24xLng1MDkuUkROKHtzdHI6ZFtlXX0pKX19O3RoaXMuc2V0QnlPYmplY3Q9ZnVuY3Rpb24oZSl7Zm9yKHZhciBjIGluIGUpe2lmKGUuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5SRE4oe3N0cjpjK1wiPVwiK2VbY119KTt0aGlzLmFzbjFBcnJheT90aGlzLmFzbjFBcnJheS5wdXNoKGQpOnRoaXMuYXNuMUFycmF5PVtkXX19fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlTdHJpbmcoYi5zdHIpfWVsc2V7aWYodHlwZW9mIGI9PT1cIm9iamVjdFwiKXt0aGlzLnNldEJ5T2JqZWN0KGIpfX1pZih0eXBlb2YgYi5jZXJ0aXNzdWVyIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgWDUwOSgpO2EuaGV4PVg1MDkucGVtVG9IZXgoYi5jZXJ0aXNzdWVyKTt0aGlzLmhUTFY9YS5nZXRJc3N1ZXJIZXgoKX1pZih0eXBlb2YgYi5jZXJ0c3ViamVjdCE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IFg1MDkoKTthLmhleD1YNTA5LnBlbVRvSGV4KGIuY2VydHN1YmplY3QpO3RoaXMuaFRMVj1hLmdldFN1YmplY3RIZXgoKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5YNTAwTmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuUkROPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LlJETi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hZGRCeVN0cmluZz1mdW5jdGlvbihiKXt0aGlzLmFzbjFBcnJheS5wdXNoKG5ldyBLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUoe3N0cjpifSkpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLlRMVj1iLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuYWRkQnlTdHJpbmcoYS5zdHIpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlJETixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGQ9bnVsbDt2YXIgYz1udWxsO3ZhciBhPVwidXRmOFwiO3RoaXMuc2V0QnlTdHJpbmc9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvXihbXj1dKyk9KC4rKSQvKSl7dGhpcy5zZXRCeUF0dHJUeXBlQW5kVmFsdWVTdHIoUmVnRXhwLiQxLFJlZ0V4cC4kMil9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIGF0dHJUeXBlQW5kVmFsdWVTdHI6IFwiK2V9fTt0aGlzLnNldEJ5QXR0clR5cGVBbmRWYWx1ZVN0cj1mdW5jdGlvbihnLGYpe3RoaXMudHlwZU9iaj1LSlVSLmFzbjEueDUwOS5PSUQuYXR5cGUyb2JqKGcpO3ZhciBlPWE7aWYoZz09XCJDXCIpe2U9XCJwcm5cIn10aGlzLnZhbHVlT2JqPXRoaXMuZ2V0VmFsdWVPYmooZSxmKX07dGhpcy5nZXRWYWx1ZU9iaj1mdW5jdGlvbihmLGUpe2lmKGY9PVwidXRmOFwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJVVEY4U3RyaW5nKHtzdHI6ZX0pfWlmKGY9PVwicHJuXCIpe3JldHVybiBuZXcgS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZyh7c3RyOmV9KX1pZihmPT1cInRlbFwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nKHtzdHI6ZX0pfWlmKGY9PVwiaWE1XCIpe3JldHVybiBuZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmV9KX10aHJvd1widW5zdXBwb3J0ZWQgZGlyZWN0b3J5IHN0cmluZyB0eXBlOiB0eXBlPVwiK2YrXCIgdmFsdWU9XCIrZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMudHlwZU9iaix0aGlzLnZhbHVlT2JqXX0pO3RoaXMuVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVN0cmluZyhiLnN0cil9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbz1mdW5jdGlvbihkKXtLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRSU0FLZXk9ZnVuY3Rpb24oZSl7aWYoIVJTQUtleS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlKSl7dGhyb3dcImFyZ3VtZW50IGlzIG5vdCBSU0FLZXkgaW5zdGFuY2VcIn10aGlzLnJzYUtleT1lO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmUubn0pO3ZhciBmPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjplLmV9KTt2YXIgaT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbZyxmXX0pO3ZhciBoPWkuZ2V0RW5jb2RlZEhleCgpO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIraH0pfTt0aGlzLnNldFJTQVBFTT1mdW5jdGlvbihnKXtpZihnLm1hdGNoKC8tLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLS8pKXt2YXIgbj1nO249bi5yZXBsYWNlKC9eLS0tLS1bXi1dKy0tLS0tLyxcIlwiKTtuPW4ucmVwbGFjZSgvLS0tLS1bXi1dKy0tLS0tXFxzKiQvLFwiXCIpO3ZhciBtPW4ucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBmPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UobSk7dmFyIGk9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkoZik7dmFyIGs9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSk7dmFyIGg9a1sxXTt2YXIgbD1oLnN1YnN0cigyKTt2YXIgZT1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChsKTt2YXIgaj1uZXcgUlNBS2V5KCk7ai5zZXRQdWJsaWMoZVswXSxlWzFdKTt0aGlzLnNldFJTQUtleShqKX1lbHNle3Rocm93XCJrZXkgbm90IHN1cHBvcnRlZFwifX07dGhpcy5nZXRBU04xT2JqZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5hc24xQWxnSWQ9PW51bGx8fHRoaXMuYXNuMVN1YmpQS2V5PT1udWxsKXt0aHJvd1wiYWxnSWQgYW5kL29yIHN1YmpQdWJLZXkgbm90IHNldFwifXZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFBbGdJZCx0aGlzLmFzbjFTdWJqUEtleV19KTtyZXR1cm4gZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRBU04xT2JqZWN0KCk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX3NldFJTQUtleT1mdW5jdGlvbihlKXt2YXIgZz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOntiaWdpbnQ6ZS5ufX0se1wiaW50XCI6e1wiaW50XCI6ZS5lfX1dfSk7dmFyIGY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5hc24xQWxnSWQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitmfSl9O3RoaXMuX3NldEVDPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTplLmN1cnZlTmFtZX0pO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwiZWNQdWJsaWNLZXlcIixhc24xcGFyYW1zOmZ9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitlLnB1YktleUhleH0pfTt0aGlzLl9zZXREU0E9ZnVuY3Rpb24oZSl7dmFyIGY9bmV3IEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6e2JpZ2ludDplLnB9fSx7XCJpbnRcIjp7YmlnaW50OmUucX19LHtcImludFwiOntiaWdpbnQ6ZS5nfX1dfSk7dGhpcy5hc24xQWxnSWQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJkc2FcIixhc24xcGFyYW1zOmZ9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplLnl9KTt0aGlzLmFzbjFTdWJqUEtleT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitnLmdldEVuY29kZWRIZXgoKX0pfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIFJTQUtleSl7dGhpcy5fc2V0UlNBS2V5KGQpfWVsc2V7aWYodHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZkIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMuX3NldEVDKGQpfWVsc2V7aWYodHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7dGhpcy5fc2V0RFNBKGQpfWVsc2V7aWYodHlwZW9mIGQucnNha2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJTQUtleShkLnJzYWtleSl9ZWxzZXtpZih0eXBlb2YgZC5yc2FwZW0hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UlNBUEVNKGQucnNhcGVtKX19fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0VGltZVBhcmFtcz1mdW5jdGlvbihkKXt0aGlzLnRpbWVQYXJhbXM9ZH07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bnVsbDtpZih0aGlzLnRpbWVQYXJhbXMhPW51bGwpe2lmKHRoaXMudHlwZT09XCJ1dGNcIil7ZD1uZXcgS0pVUi5hc24xLkRFUlVUQ1RpbWUodGhpcy50aW1lUGFyYW1zKX1lbHNle2Q9bmV3IEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUodGhpcy50aW1lUGFyYW1zKX19ZWxzZXtpZih0aGlzLnR5cGU9PVwidXRjXCIpe2Q9bmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKCl9ZWxzZXtkPW5ldyBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKCl9fXRoaXMuVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07dGhpcy50eXBlPVwidXRjXCI7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnR5cGUhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1jLnR5cGV9ZWxzZXtpZih0eXBlb2YgYy5zdHIhPVwidW5kZWZpbmVkXCIpe2lmKGMuc3RyLm1hdGNoKC9eWzAtOV17MTJ9WiQvKSl7dGhpcy50eXBlPVwidXRjXCJ9aWYoYy5zdHIubWF0Y2goL15bMC05XXsxNH1aJC8pKXt0aGlzLnR5cGU9XCJnZW5cIn19fXRoaXMudGltZVBhcmFtcz1jfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcj1mdW5jdGlvbihlKXtLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3ZhciBkPW51bGw7dmFyIGI9bnVsbDt2YXIgYz1mYWxzZTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLm5hbWVBbGc9PW51bGwmJnRoaXMuYXNuMUFsZz09bnVsbCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkXCJ9aWYodGhpcy5uYW1lQWxnIT1udWxsJiZ0aGlzLmFzbjFBbGc9PW51bGwpe3RoaXMuYXNuMUFsZz1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvYmoodGhpcy5uYW1lQWxnKX12YXIgZj1bdGhpcy5hc24xQWxnXTtpZighdGhpcy5wYXJhbUVtcHR5KXtmLnB1c2godGhpcy5hc24xUGFyYW1zKX12YXIgZz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpmfSk7dGhpcy5oVExWPWcuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5uYW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLm5hbWVBbGc9ZS5uYW1lfWlmKHR5cGVvZiBlLmFzbjFwYXJhbXMhPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMVBhcmFtcz1lLmFzbjFwYXJhbXN9aWYodHlwZW9mIGUucGFyYW1lbXB0eSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbUVtcHR5PWUucGFyYW1lbXB0eX19aWYodGhpcy5hc24xUGFyYW1zPT1udWxsKXt0aGlzLmFzbjFQYXJhbXM9bmV3IEtKVVIuYXNuMS5ERVJOdWxsKCl9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZT1mdW5jdGlvbihkKXtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGM9bnVsbDt2YXIgYj1udWxsO3ZhciBhPXtyZmM4MjI6XCI4MVwiLGRuczpcIjgyXCIsZG46XCJhNFwiLHVyaTpcIjg2XCJ9O3RoaXMuZXhwbGljaXQ9ZmFsc2U7dGhpcy5zZXRCeVBhcmFtPWZ1bmN0aW9uKGspe3ZhciBqPW51bGw7dmFyIGc9bnVsbDtpZih0eXBlb2Ygaz09XCJ1bmRlZmluZWRcIil7cmV0dXJufWlmKHR5cGVvZiBrLnJmYzgyMiE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwicmZjODIyXCI7Zz1uZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmtbdGhpcy50eXBlXX0pfWlmKHR5cGVvZiBrLmRucyE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5zXCI7Zz1uZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmtbdGhpcy50eXBlXX0pfWlmKHR5cGVvZiBrLnVyaSE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwidXJpXCI7Zz1uZXcgS0pVUi5hc24xLkRFUklBNVN0cmluZyh7c3RyOmtbdGhpcy50eXBlXX0pfWlmKHR5cGVvZiBrLmNlcnRpc3N1ZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuXCI7dGhpcy5leHBsaWNpdD10cnVlO3ZhciBoPWsuY2VydGlzc3Vlcjt2YXIgZj1udWxsO2lmKGgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2Y9PWh9aWYoaC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtmPVg1MDkucGVtVG9IZXgoaCl9aWYoZj09bnVsbCl7dGhyb3dcImNlcnRpc3N1ZXIgcGFyYW0gbm90IGNlcnRcIn12YXIgZT1uZXcgWDUwOSgpO2UuaGV4PWY7dmFyIGk9ZS5nZXRJc3N1ZXJIZXgoKTtnPW5ldyBLSlVSLmFzbjEuQVNOMU9iamVjdCgpO2cuaFRMVj1pfWlmKHR5cGVvZiBrLmNlcnRzdWJqIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkblwiO3RoaXMuZXhwbGljaXQ9dHJ1ZTt2YXIgaD1rLmNlcnRzdWJqO3ZhciBmPW51bGw7aWYoaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zj09aH1pZihoLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe2Y9WDUwOS5wZW1Ub0hleChoKX1pZihmPT1udWxsKXt0aHJvd1wiY2VydHN1YmogcGFyYW0gbm90IGNlcnRcIn12YXIgZT1uZXcgWDUwOSgpO2UuaGV4PWY7dmFyIGk9ZS5nZXRTdWJqZWN0SGV4KCk7Zz1uZXcgS0pVUi5hc24xLkFTTjFPYmplY3QoKTtnLmhUTFY9aX1pZih0aGlzLnR5cGU9PW51bGwpe3Rocm93XCJ1bnN1cHBvcnRlZCB0eXBlIGluIHBhcmFtcz1cIitrfXRoaXMuYXNuMU9iaj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dGhpcy5leHBsaWNpdCx0YWc6YVt0aGlzLnR5cGVdLG9iajpnfSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFPYmouZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVBhcmFtKGQpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcz1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeVBhcmFtQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciBjPTA7YzxlLmxlbmd0aDtjKyspe3ZhciBkPW5ldyBLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZShlW2NdKTt0aGlzLmFzbjFBcnJheS5wdXNoKGQpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTtyZXR1cm4gYy5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5UGFyYW1BcnJheShiKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGU9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dmFyIGQ9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGUhPVwiZnVsbFwiKXt0aHJvd1wiY3VycmVudGx5IHR5cGUgc2hhbGwgYmUgJ2Z1bGwnOiBcIit0aGlzLnR5cGV9dGhpcy5hc24xT2JqPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDpmYWxzZSx0YWc6dGhpcy50YWcsb2JqOnRoaXMuYXNuMVZ9KTt0aGlzLmhUTFY9dGhpcy5hc24xT2JqLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYoS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGIpKXt0aGlzLnR5cGU9XCJmdWxsXCI7dGhpcy50YWc9XCJhMFwiO3RoaXMuYXNuMVY9Yn1lbHNle3Rocm93XCJUaGlzIGNsYXNzIHN1cHBvcnRzIEdlbmVyYWxOYW1lcyBvbmx5IGFzIGFyZ3VtZW50XCJ9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludD1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKCk7aWYodGhpcy5hc24xRFAhPW51bGwpe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0KHtleHBsaWNpdDp0cnVlLHRhZzpcImEwXCIsb2JqOnRoaXMuYXNuMURQfSk7Yy5hcHBlbmRBU04xT2JqZWN0KGQpfXRoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuZHBvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMURQPWIuZHBvYmp9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5Lk9JRD1uZXcgZnVuY3Rpb24oYSl7dGhpcy5hdHlwZTJvaWRMaXN0PXtDOlwiMi41LjQuNlwiLE86XCIyLjUuNC4xMFwiLE9VOlwiMi41LjQuMTFcIixTVDpcIjIuNS40LjhcIixMOlwiMi41LjQuN1wiLENOOlwiMi41LjQuM1wiLEROOlwiMi41LjQuNDlcIixEQzpcIjAuOS4yMzQyLjE5MjAwMzAwLjEwMC4xLjI1XCIsfTt0aGlzLm5hbWUyb2lkTGlzdD17c2hhMTpcIjEuMy4xNC4zLjIuMjZcIixzaGEyNTY6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4xXCIsc2hhMzg0OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuMlwiLHNoYTUxMjpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjNcIixzaGEyMjQ6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi40XCIsbWQ1OlwiMS4yLjg0MC4xMTM1NDkuMi41XCIsbWQyOlwiMS4zLjE0LjcuMi4yLjFcIixyaXBlbWQxNjA6XCIxLjMuMzYuMy4yLjFcIixNRDJ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjJcIixNRDR3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjNcIixNRDV3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjRcIixTSEExd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS41XCIsU0hBMjI0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xNFwiLFNIQTI1NndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTFcIixTSEEzODR3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjEyXCIsU0hBNTEyd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xM1wiLFNIQTF3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMVwiLFNIQTIyNHdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjFcIixTSEEyNTZ3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4yXCIsU0hBMzg0d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuM1wiLFNIQTUxMndpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjRcIixkc2E6XCIxLjIuODQwLjEwMDQwLjQuMVwiLFNIQTF3aXRoRFNBOlwiMS4yLjg0MC4xMDA0MC40LjNcIixTSEEyMjR3aXRoRFNBOlwiMi4xNi44NDAuMS4xMDEuMy40LjMuMVwiLFNIQTI1NndpdGhEU0E6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMy4yXCIscnNhRW5jcnlwdGlvbjpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCIsY291bnRyeU5hbWU6XCIyLjUuNC42XCIsb3JnYW5pemF0aW9uOlwiMi41LjQuMTBcIixvcmdhbml6YXRpb25hbFVuaXQ6XCIyLjUuNC4xMVwiLHN0YXRlT3JQcm92aW5jZU5hbWU6XCIyLjUuNC44XCIsbG9jYWxpdHk6XCIyLjUuNC43XCIsY29tbW9uTmFtZTpcIjIuNS40LjNcIixzdWJqZWN0S2V5SWRlbnRpZmllcjpcIjIuNS4yOS4xNFwiLGtleVVzYWdlOlwiMi41LjI5LjE1XCIsc3ViamVjdEFsdE5hbWU6XCIyLjUuMjkuMTdcIixiYXNpY0NvbnN0cmFpbnRzOlwiMi41LjI5LjE5XCIsbmFtZUNvbnN0cmFpbnRzOlwiMi41LjI5LjMwXCIsY1JMRGlzdHJpYnV0aW9uUG9pbnRzOlwiMi41LjI5LjMxXCIsY2VydGlmaWNhdGVQb2xpY2llczpcIjIuNS4yOS4zMlwiLGF1dGhvcml0eUtleUlkZW50aWZpZXI6XCIyLjUuMjkuMzVcIixwb2xpY3lDb25zdHJhaW50czpcIjIuNS4yOS4zNlwiLGV4dEtleVVzYWdlOlwiMi41LjI5LjM3XCIsYXV0aG9yaXR5SW5mb0FjY2VzczpcIjEuMy42LjEuNS41LjcuMS4xXCIsYW55RXh0ZW5kZWRLZXlVc2FnZTpcIjIuNS4yOS4zNy4wXCIsc2VydmVyQXV0aDpcIjEuMy42LjEuNS41LjcuMy4xXCIsY2xpZW50QXV0aDpcIjEuMy42LjEuNS41LjcuMy4yXCIsY29kZVNpZ25pbmc6XCIxLjMuNi4xLjUuNS43LjMuM1wiLGVtYWlsUHJvdGVjdGlvbjpcIjEuMy42LjEuNS41LjcuMy40XCIsdGltZVN0YW1waW5nOlwiMS4zLjYuMS41LjUuNy4zLjhcIixvY3NwU2lnbmluZzpcIjEuMy42LjEuNS41LjcuMy45XCIsZWNQdWJsaWNLZXk6XCIxLjIuODQwLjEwMDQ1LjIuMVwiLHNlY3AyNTZyMTpcIjEuMi44NDAuMTAwNDUuMy4xLjdcIixzZWNwMjU2azE6XCIxLjMuMTMyLjAuMTBcIixzZWNwMzg0cjE6XCIxLjMuMTMyLjAuMzRcIixwa2NzNVBCRVMyOlwiMS4yLjg0MC4xMTM1NDkuMS41LjEzXCIscGtjczVQQktERjI6XCIxLjIuODQwLjExMzU0OS4xLjUuMTJcIixcImRlcy1FREUzLUNCQ1wiOlwiMS4yLjg0MC4xMTM1NDkuMy43XCIsZGF0YTpcIjEuMi44NDAuMTEzNTQ5LjEuNy4xXCIsXCJzaWduZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjJcIixcImVudmVsb3BlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjcuM1wiLFwiZGlnZXN0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjVcIixcImVuY3J5cHRlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjcuNlwiLFwiYXV0aGVudGljYXRlZC1kYXRhXCI6XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMS4yXCIsdHN0aW5mbzpcIjEuMi44NDAuMTEzNTQ5LjEuOS4xNi4xLjRcIix9O3RoaXMub2JqQ2FjaGU9e307dGhpcy5uYW1lMm9iaj1mdW5jdGlvbihiKXtpZih0eXBlb2YgdGhpcy5vYmpDYWNoZVtiXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIHRoaXMub2JqQ2FjaGVbYl19aWYodHlwZW9mIHRoaXMubmFtZTJvaWRMaXN0W2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiTmFtZSBvZiBPYmplY3RJZGVudGlmaWVyIG5vdCBkZWZpbmVkOiBcIitifXZhciBjPXRoaXMubmFtZTJvaWRMaXN0W2JdO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmN9KTt0aGlzLm9iakNhY2hlW2JdPWQ7cmV0dXJuIGR9O3RoaXMuYXR5cGUyb2JqPWZ1bmN0aW9uKGIpe2lmKHR5cGVvZiB0aGlzLm9iakNhY2hlW2JdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gdGhpcy5vYmpDYWNoZVtiXX1pZih0eXBlb2YgdGhpcy5hdHlwZTJvaWRMaXN0W2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiQXR0cmlidXRlVHlwZSBuYW1lIHVuZGVmaW5lZDogXCIrYn12YXIgYz10aGlzLmF0eXBlMm9pZExpc3RbYl07dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPYmplY3RJZGVudGlmaWVyKHtvaWQ6Y30pO3RoaXMub2JqQ2FjaGVbYl09ZDtyZXR1cm4gZH19O0tKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZT1mdW5jdGlvbihiKXt2YXIgYz1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0O2Zvcih2YXIgYSBpbiBjKXtpZihjW2FdPT1iKXtyZXR1cm4gYX19cmV0dXJuXCJcIn07S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkPWZ1bmN0aW9uKGEpe3ZhciBiPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3Q7aWYoYlthXT09PXVuZGVmaW5lZCl7cmV0dXJuXCJcIn1yZXR1cm4gYlthXX07S0pVUi5hc24xLng1MDkuWDUwOVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5nZXRQS0NTOFB1YktleVBFTWZyb21SU0FLZXk9ZnVuY3Rpb24oaSl7dmFyIGg9bnVsbDt2YXIgZj1LSlVSLmFzbjEuQVNOMVV0aWwuYmlnSW50VG9NaW5Ud29zQ29tcGxlbWVudHNIZXgoaS5uKTt2YXIgaj1LSlVSLmFzbjEuQVNOMVV0aWwuaW50ZWdlclRvQnl0ZUhleChpLmUpO3ZhciBhPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7aGV4OmZ9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2hleDpqfSk7dmFyIGw9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2EsZ119KTt2YXIgYz1sLmdldEVuY29kZWRIZXgoKTt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3ZhciBiPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2N9KTt2YXIgaz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbZCxiXX0pO3ZhciBlPWsuZ2V0RW5jb2RlZEhleCgpO3ZhciBoPUtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGUsXCJQVUJMSUMgS0VZXCIpO3JldHVybiBofX07S0pVUi5hc24xLng1MDkuWDUwOVV0aWwubmV3Q2VydFBFTT1mdW5jdGlvbihmKXt2YXIgYz1LSlVSLmFzbjEueDUwOTt2YXIgZT1uZXcgYy5UQlNDZXJ0aWZpY2F0ZSgpO2lmKGYuc2VyaWFsIT09dW5kZWZpbmVkKXtlLnNldFNlcmlhbE51bWJlckJ5UGFyYW0oZi5zZXJpYWwpfWVsc2V7dGhyb3dcInNlcmlhbCBudW1iZXIgdW5kZWZpbmVkLlwifWlmKHR5cGVvZiBmLnNpZ2FsZy5uYW1lPT1cInN0cmluZ1wiKXtlLnNldFNpZ25hdHVyZUFsZ0J5UGFyYW0oZi5zaWdhbGcpfWVsc2V7dGhyb3dcInVucHJvcGVyIHNpZ25hdHVyZSBhbGdvcml0aG0gbmFtZVwifWlmKGYuaXNzdWVyIT09dW5kZWZpbmVkKXtlLnNldElzc3VlckJ5UGFyYW0oZi5pc3N1ZXIpfWVsc2V7dGhyb3dcImlzc3VlciBuYW1lIHVuZGVmaW5lZC5cIn1pZihmLm5vdGJlZm9yZSE9PXVuZGVmaW5lZCl7ZS5zZXROb3RCZWZvcmVCeVBhcmFtKGYubm90YmVmb3JlKX1lbHNle3Rocm93XCJub3RiZWZvcmUgdW5kZWZpbmVkLlwifWlmKGYubm90YWZ0ZXIhPT11bmRlZmluZWQpe2Uuc2V0Tm90QWZ0ZXJCeVBhcmFtKGYubm90YWZ0ZXIpfWVsc2V7dGhyb3dcIm5vdGFmdGVyIHVuZGVmaW5lZC5cIn1pZihmLnN1YmplY3QhPT11bmRlZmluZWQpe2Uuc2V0U3ViamVjdEJ5UGFyYW0oZi5zdWJqZWN0KX1lbHNle3Rocm93XCJzdWJqZWN0IG5hbWUgdW5kZWZpbmVkLlwifWlmKGYuc2JqcHVia2V5IT09dW5kZWZpbmVkKXtlLnNldFN1YmplY3RQdWJsaWNLZXlCeUdldEtleShmLnNianB1YmtleSl9ZWxzZXt0aHJvd1wic3ViamVjdCBwdWJsaWMga2V5IHVuZGVmaW5lZC5cIn1pZihmLmV4dCE9PXVuZGVmaW5lZCYmZi5leHQubGVuZ3RoIT09dW5kZWZpbmVkKXtmb3IodmFyIGI9MDtiPGYuZXh0Lmxlbmd0aDtiKyspe2ZvcihrZXkgaW4gZi5leHRbYl0pe2UuYXBwZW5kRXh0ZW5zaW9uQnlOYW1lKGtleSxmLmV4dFtiXVtrZXldKX19fWlmKGYuY2FrZXk9PT11bmRlZmluZWQmJmYuc2lnaGV4PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW0gY2FrZXkgYW5kIHNpZ2hleCB1bmRlZmluZWQuXCJ9dmFyIGQ9bnVsbDt2YXIgYT1udWxsO2lmKGYuY2FrZXkpe2Q9S0VZVVRJTC5nZXRLZXkuYXBwbHkobnVsbCxmLmNha2V5KTthPW5ldyBjLkNlcnRpZmljYXRlKHt0YnNjZXJ0b2JqOmUscHJ2a2V5b2JqOmR9KTthLnNpZ24oKX1pZihmLnNpZ2hleCl7YT1uZXcgYy5DZXJ0aWZpY2F0ZSh7dGJzY2VydG9iajplfSk7YS5zZXRTaWduYXR1cmVIZXgoZi5zaWdoZXgpfXJldHVybiBhLmdldFBFTVN0cmluZygpfTtcbi8qISBhc24xY21zLTEuMC4yLmpzIChjKSAyMDEzLTIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLmNtcz09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jbXMpe0tKVVIuYXNuMS5jbXM9e319S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPVtdO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmLGUsYztmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOnRoaXMuYXR0clR5cGVPaWR9KTtlPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLnZhbHVlTGlzdH0pO3RyeXtlLmdldEVuY29kZWRIZXgoKX1jYXRjaChkKXt0aHJvd1wiZmFpbCB2YWx1ZVNldC5nZXRFbmNvZGVkSGV4IGluIEF0dHJpYnV0ZSgxKS9cIitkfWM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2YsZV19KTt0cnl7dGhpcy5oVExWPWMuZ2V0RW5jb2RlZEhleCgpfWNhdGNoKGQpe3Rocm93XCJmYWlsZWQgc2VxLmdldEVuY29kZWRIZXggaW4gQXR0cmlidXRlKDIpL1wiK2R9cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jbXMuQ29udGVudFR5cGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuM1wiO3ZhciBhPW51bGw7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcihiKTt0aGlzLnZhbHVlTGlzdD1bYV19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3Q9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjRcIjtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYoZS5lY2lPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvJiZ0eXBlb2YgZS5oYXNoQWxnPT1cInN0cmluZ1wiKXt2YXIgYj1lLmVjaU9iai5lQ29udGVudFZhbHVlSGV4O3ZhciBhPWUuaGFzaEFsZzt2YXIgYz1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYixhKTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKHtoZXg6Y30pO2QuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtkXX1lbHNle3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoZSk7ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2RdfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdCxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nVGltZT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjVcIjtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYyk7dHJ5e2EuZ2V0RW5jb2RlZEhleCgpfWNhdGNoKGIpe3Rocm93XCJTaWduaW5nVGltZS5nZXRFbmNvZGVkSGV4KCkgZmFpbGVkL1wiK2J9dGhpcy52YWx1ZUxpc3Q9W2FdfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduaW5nVGltZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGU9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4xMlwiO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEuY21zO3ZhciBiPUtKVVIuY3J5cHRvO3RoaXMuc2V0Q2VydHM9ZnVuY3Rpb24obCl7dmFyIGo9W107Zm9yKHZhciBoPTA7aDxsLmxlbmd0aDtoKyspe3ZhciBmPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShsW2hdKTt2YXIgZT1iLlV0aWwuaGFzaEhleChmLFwic2hhMVwiKTt2YXIgbT1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmV9KTttLmdldEVuY29kZWRIZXgoKTt2YXIgaz1uZXcgYy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6bFtoXX0pO2suZ2V0RW5jb2RlZEhleCgpO3ZhciBuPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbbSxrXX0pO24uZ2V0RW5jb2RlZEhleCgpO2oucHVzaChuKX12YXIgZz1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6an0pO2cuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtnXX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBkLmFycmF5PT1cIm9iamVjdFwiKXt0aGlzLnNldENlcnRzKGQuYXJyYXkpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi40N1wiO3ZhciBiPUtKVVIuYXNuMTt2YXIgZj1LSlVSLmFzbjEueDUwOTt2YXIgZD1LSlVSLmFzbjEuY21zO3ZhciBjPUtKVVIuY3J5cHRvO3RoaXMuc2V0Q2VydHM9ZnVuY3Rpb24ocCxoKXt2YXIgbj1bXTtmb3IodmFyIGw9MDtsPHAubGVuZ3RoO2wrKyl7dmFyIGo9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKHBbbF0pO3ZhciByPVtdO2lmKGghPVwic2hhMjU2XCIpe3IucHVzaChuZXcgZi5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmh9KSl9dmFyIGc9Yy5VdGlsLmhhc2hIZXgoaixoKTt2YXIgcT1uZXcgYi5ERVJPY3RldFN0cmluZyh7aGV4Omd9KTtxLmdldEVuY29kZWRIZXgoKTtyLnB1c2gocSk7dmFyIG09bmV3IGQuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OnBbbF19KTttLmdldEVuY29kZWRIZXgoKTtyLnB1c2gobSk7dmFyIG89bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5OnJ9KTtvLmdldEVuY29kZWRIZXgoKTtuLnB1c2gobyl9dmFyIGs9bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5Om59KTtrLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1ba119O2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5hcnJheT09XCJvYmplY3RcIil7dmFyIGE9XCJzaGEyNTZcIjtpZih0eXBlb2YgZS5oYXNoQWxnPT1cInN0cmluZ1wiKXthPWUuaGFzaEFsZ310aGlzLnNldENlcnRzKGUuYXJyYXksYSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMixLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXI9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt2YXIgYT1LSlVSLmFzbjE7dmFyIGQ9YS54NTA5O3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGkpe3ZhciBnPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShpKTt2YXIgZj1uZXcgWDUwOSgpO2YuaGV4PWc7dmFyIGo9Zi5nZXRJc3N1ZXJIZXgoKTt0aGlzLmRJc3N1ZXI9bmV3IGQuWDUwME5hbWUoKTt0aGlzLmRJc3N1ZXIuaFRMVj1qO3ZhciBoPWYuZ2V0U2VyaWFsTnVtYmVySGV4KCk7dGhpcy5kU2VyaWFsPW5ldyBhLkRFUkludGVnZXIoe2hleDpofSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRJc3N1ZXIsdGhpcy5kU2VyaWFsXX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCImJmMuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oYyl9aWYoYy5pc3N1ZXImJmMuc2VyaWFsKXtpZihjLmlzc3VlciBpbnN0YW5jZW9mIEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKXt0aGlzLmRJc3N1ZXI9Yy5pc3N1ZXJ9ZWxzZXt0aGlzLmRJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGMuaXNzdWVyKX1pZihjLnNlcmlhbCBpbnN0YW5jZW9mIEtKVVIuYXNuMS5ERVJJbnRlZ2VyKXt0aGlzLmRTZXJpYWw9Yy5zZXJpYWx9ZWxzZXt0aGlzLmRTZXJpYWw9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGMuc2VyaWFsKX19aWYodHlwZW9mIGMuY2VydD09XCJzdHJpbmdcIil7dGhpcy5zZXRCeUNlcnRQRU0oYy5jZXJ0KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLklzc3VlckFuZFNlcmlhbE51bWJlcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0PWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5saXN0PW5ldyBBcnJheSgpO3RoaXMuc29ydEZsYWc9dHJ1ZTt0aGlzLmFkZD1mdW5jdGlvbihiKXtpZihiIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpe3RoaXMubGlzdC5wdXNoKGIpfX07dGhpcy5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0Lmxlbmd0aH07dGhpcy5jbGVhcj1mdW5jdGlvbigpe3RoaXMubGlzdD1uZXcgQXJyYXkoKTt0aGlzLmhUTFY9bnVsbDt0aGlzLmhWPW51bGx9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMubGlzdCxzb3J0ZmxhZzp0aGlzLnNvcnRGbGFnfSk7dGhpcy5oVExWPWIuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5zb3J0ZmxhZyE9XCJ1bmRlZmluZWRcIiYmYS5zb3J0ZmxhZz09ZmFsc2Upe3RoaXMuc29ydEZsYWc9ZmFsc2V9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLlNpZ25lckluZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduZXJJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDTVNWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZFNpZ25lcklkZW50aWZpZXI9bnVsbDt0aGlzLmREaWdlc3RBbGdvcml0aG09bnVsbDt0aGlzLmRTaWduZWRBdHRycz1uZXcgYi5BdHRyaWJ1dGVMaXN0KCk7dGhpcy5kU2lnQWxnPW51bGw7dGhpcy5kU2lnPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycz1uZXcgYi5BdHRyaWJ1dGVMaXN0KCk7dGhpcy5zZXRTaWduZXJJZGVudGlmaWVyPWZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBmPT1cInN0cmluZ1wiJiZmLmluZGV4T2YoXCJDRVJUSUZJQ0FURVwiKSE9LTEmJmYuaW5kZXhPZihcIkJFR0lOXCIpIT0tMSYmZi5pbmRleE9mKFwiRU5EXCIpIT0tMSl7dmFyIGU9Zjt0aGlzLmRTaWduZXJJZGVudGlmaWVyPW5ldyBiLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpmfSl9fTt0aGlzLnNldEZvckNvbnRlbnRBbmRIYXNoPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZihlLmVjaU9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm8pe3RoaXMuZFNpZ25lZEF0dHJzLmFkZChuZXcgYi5Db250ZW50VHlwZSh7b2lkOlwiMS4yLjg0MC4xMTM1NDkuMS43LjFcIn0pKTt0aGlzLmRTaWduZWRBdHRycy5hZGQobmV3IGIuTWVzc2FnZURpZ2VzdCh7ZWNpT2JqOmUuZWNpT2JqLGhhc2hBbGc6ZS5oYXNoQWxnfSkpfWlmKHR5cGVvZiBlLnNkT2JqIT1cInVuZGVmaW5lZFwiJiZlLnNkT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5TaWduZWREYXRhKXtpZihlLnNkT2JqLmRpZ2VzdEFsZ05hbWVMaXN0LmpvaW4oXCI6XCIpLmluZGV4T2YoZS5oYXNoQWxnKT09LTEpe2Uuc2RPYmouZGlnZXN0QWxnTmFtZUxpc3QucHVzaChlLmhhc2hBbGcpfX1pZih0eXBlb2YgZS5oYXNoQWxnPT1cInN0cmluZ1wiKXt0aGlzLmREaWdlc3RBbGdvcml0aG09bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTplLmhhc2hBbGd9KX19fTt0aGlzLnNpZ249ZnVuY3Rpb24oaixmKXt0aGlzLmRTaWdBbGc9bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpmfSk7dmFyIGc9dGhpcy5kU2lnbmVkQXR0cnMuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPUtFWVVUSUwuZ2V0S2V5KGopO3ZhciBpPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpmfSk7aS5pbml0KGUpO2kudXBkYXRlSGV4KGcpO3ZhciBoPWkuc2lnbigpO3RoaXMuZFNpZz1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4Omh9KX07dGhpcy5hZGRVbnNpZ25lZD1mdW5jdGlvbihlKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmRVbnNpZ25lZEF0dHJzLmhUTFY9bnVsbDt0aGlzLmRVbnNpZ25lZEF0dHJzLmFkZChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU2lnbmVkQXR0cnMgaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3QmJnRoaXMuZFNpZ25lZEF0dHJzLmxlbmd0aCgpPT0wKXt0aHJvd1wiU2lnbmVkQXR0cnMgbGVuZ3RoID0gMCAoZW1wdHkpXCJ9dmFyIGU9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6dGhpcy5kU2lnbmVkQXR0cnMsdGFnOlwiYTBcIixleHBsaWNpdDpmYWxzZX0pO3ZhciBoPW51bGw7aWYodGhpcy5kVW5zaWduZWRBdHRycy5sZW5ndGgoKT4wKXtoPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZFVuc2lnbmVkQXR0cnMsdGFnOlwiYTFcIixleHBsaWNpdDpmYWxzZX0pfXZhciBnPVt0aGlzLmRDTVNWZXJzaW9uLHRoaXMuZFNpZ25lcklkZW50aWZpZXIsdGhpcy5kRGlnZXN0QWxnb3JpdGhtLGUsdGhpcy5kU2lnQWxnLHRoaXMuZFNpZyxdO2lmKGghPW51bGwpe2cucHVzaChoKX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Z30pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduZXJJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuRW5jYXBzdWxhdGVkQ29udGVudEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZEVDb250ZW50VHlwZT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKHtuYW1lOlwiZGF0YVwifSk7dGhpcy5kRUNvbnRlbnQ9bnVsbDt0aGlzLmlzRGV0YWNoZWQ9ZmFsc2U7dGhpcy5lQ29udGVudFZhbHVlSGV4PW51bGw7dGhpcy5zZXRDb250ZW50VHlwZT1mdW5jdGlvbihlKXtpZihlLm1hdGNoKC9eWzAtMl1bLl1bMC05Ll0rJC8pKXt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmV9KX1lbHNle3RoaXMuZEVDb250ZW50VHlwZT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKHtuYW1lOmV9KX19O3RoaXMuc2V0Q29udGVudFZhbHVlPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5oZXg9PVwic3RyaW5nXCIpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1lLmhleH1lbHNle2lmKHR5cGVvZiBlLnN0cj09XCJzdHJpbmdcIil7dGhpcy5lQ29udGVudFZhbHVlSGV4PXV0Zjh0b2hleChlLnN0cil9fX19O3RoaXMuc2V0Q29udGVudFZhbHVlSGV4PWZ1bmN0aW9uKGUpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1lfTt0aGlzLnNldENvbnRlbnRWYWx1ZVN0cj1mdW5jdGlvbihlKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9dXRmOHRvaGV4KGUpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5lQ29udGVudFZhbHVlSGV4IT1cInN0cmluZ1wiKXt0aHJvd1wiZUNvbnRlbnRWYWx1ZSBub3QgeWV0IHNldFwifXZhciBnPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6dGhpcy5lQ29udGVudFZhbHVlSGV4fSk7dGhpcy5kRUNvbnRlbnQ9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6Zyx0YWc6XCJhMFwiLGV4cGxpY2l0OnRydWV9KTt2YXIgZT1bdGhpcy5kRUNvbnRlbnRUeXBlXTtpZighdGhpcy5pc0RldGFjaGVkKXtlLnB1c2godGhpcy5kRUNvbnRlbnQpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuQ29udGVudEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENvbnRlbnRUeXBlPW51bGw7dGhpcy5kQ29udGVudD1udWxsO3RoaXMuc2V0Q29udGVudFR5cGU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PVwic3RyaW5nXCIpe3RoaXMuZENvbnRlbnRUeXBlPWQuT0lELm5hbWUyb2JqKGUpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGY9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6dGhpcy5kQ29udGVudCx0YWc6XCJhMFwiLGV4cGxpY2l0OnRydWV9KTt2YXIgZT1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuZENvbnRlbnRUeXBlLGZdfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZihjLnR5cGUpe3RoaXMuc2V0Q29udGVudFR5cGUoYy50eXBlKX1pZihjLm9iaiYmYy5vYmogaW5zdGFuY2VvZiBhLkFTTjFPYmplY3Qpe3RoaXMuZENvbnRlbnQ9Yy5vYmp9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Db250ZW50SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5TaWduZWREYXRhPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ01TVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmREaWdlc3RBbGdzPW51bGw7dGhpcy5kaWdlc3RBbGdOYW1lTGlzdD1bXTt0aGlzLmRFbmNhcENvbnRlbnRJbmZvPW5ldyBiLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvKCk7dGhpcy5kQ2VydHM9bnVsbDt0aGlzLmNlcnRpZmljYXRlTGlzdD1bXTt0aGlzLmNybExpc3Q9W107dGhpcy5zaWduZXJJbmZvTGlzdD1bbmV3IGIuU2lnbmVySW5mbygpXTt0aGlzLmFkZENlcnRpZmljYXRlc0J5UEVNPWZ1bmN0aW9uKGUpe3ZhciBmPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShlKTt2YXIgZz1uZXcgYS5BU04xT2JqZWN0KCk7Zy5oVExWPWY7dGhpcy5jZXJ0aWZpY2F0ZUxpc3QucHVzaChnKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn1pZih0aGlzLmREaWdlc3RBbGdzPT1udWxsKXt2YXIgaz1bXTtmb3IodmFyIGo9MDtqPHRoaXMuZGlnZXN0QWxnTmFtZUxpc3QubGVuZ3RoO2orKyl7dmFyIGg9dGhpcy5kaWdlc3RBbGdOYW1lTGlzdFtqXTt2YXIgbT1uZXcgZC5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmh9KTtrLnB1c2gobSl9dGhpcy5kRGlnZXN0QWxncz1uZXcgYS5ERVJTZXQoe2FycmF5Omt9KX12YXIgZT1bdGhpcy5kQ01TVmVyc2lvbix0aGlzLmREaWdlc3RBbGdzLHRoaXMuZEVuY2FwQ29udGVudEluZm9dO2lmKHRoaXMuZENlcnRzPT1udWxsKXtpZih0aGlzLmNlcnRpZmljYXRlTGlzdC5sZW5ndGg+MCl7dmFyIGw9bmV3IGEuREVSU2V0KHthcnJheTp0aGlzLmNlcnRpZmljYXRlTGlzdH0pO3RoaXMuZENlcnRzPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmwsdGFnOlwiYTBcIixleHBsaWNpdDpmYWxzZX0pfX1pZih0aGlzLmRDZXJ0cyE9bnVsbCl7ZS5wdXNoKHRoaXMuZENlcnRzKX12YXIgZz1uZXcgYS5ERVJTZXQoe2FycmF5OnRoaXMuc2lnbmVySW5mb0xpc3R9KTtlLnB1c2goZyk7dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRDb250ZW50SW5mbz1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPW5ldyBiLkNvbnRlbnRJbmZvKHt0eXBlOlwic2lnbmVkLWRhdGFcIixvYmo6dGhpc30pO3JldHVybiBlfTt0aGlzLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29udGVudEluZm8oKTt2YXIgZj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gZn07dGhpcy5nZXRQRU09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpO3ZhciBmPWEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChlLFwiQ01TXCIpO3JldHVybiBmfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5TaWduZWREYXRhLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY21zLkNNU1V0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY21zLkNNU1V0aWwubmV3U2lnbmVkRGF0YT1mdW5jdGlvbihhKXt2YXIgaD1LSlVSLmFzbjEuY21zO3ZhciBnPUtKVVIuYXNuMS5jYWRlczt2YXIgZj1uZXcgaC5TaWduZWREYXRhKCk7Zi5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VmFsdWUoYS5jb250ZW50KTtpZih0eXBlb2YgYS5jZXJ0cz09XCJvYmplY3RcIil7Zm9yKHZhciBiPTA7YjxhLmNlcnRzLmxlbmd0aDtiKyspe2YuYWRkQ2VydGlmaWNhdGVzQnlQRU0oYS5jZXJ0c1tiXSl9fWYuc2lnbmVySW5mb0xpc3Q9W107Zm9yKHZhciBiPTA7YjxhLnNpZ25lckluZm9zLmxlbmd0aDtiKyspe3ZhciBkPWEuc2lnbmVySW5mb3NbYl07dmFyIGM9bmV3IGguU2lnbmVySW5mbygpO2Muc2V0U2lnbmVySWRlbnRpZmllcihkLnNpZ25lckNlcnQpO2Muc2V0Rm9yQ29udGVudEFuZEhhc2goe3NkT2JqOmYsZWNpT2JqOmYuZEVuY2FwQ29udGVudEluZm8saGFzaEFsZzpkLmhhc2hBbGd9KTtmb3IoYXR0ck5hbWUgaW4gZC5zQXR0cil7dmFyIGo9ZC5zQXR0clthdHRyTmFtZV07aWYoYXR0ck5hbWU9PVwiU2lnbmluZ1RpbWVcIil7dmFyIGU9bmV3IGguU2lnbmluZ1RpbWUoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfWlmKGF0dHJOYW1lPT1cIlNpZ25pbmdDZXJ0aWZpY2F0ZVwiKXt2YXIgZT1uZXcgaC5TaWduaW5nQ2VydGlmaWNhdGUoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfWlmKGF0dHJOYW1lPT1cIlNpZ25pbmdDZXJ0aWZpY2F0ZVYyXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyXCIpe3ZhciBlPW5ldyBnLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXIoaik7Yy5kU2lnbmVkQXR0cnMuYWRkKGUpfX1jLnNpZ24oZC5zaWduZXJQcnZLZXksZC5zaWdBbGcpO2Yuc2lnbmVySW5mb0xpc3QucHVzaChjKX1yZXR1cm4gZn07XG4vKiEgYXNuMXRzcC0xLjAuMS5qcyAoYykgMjAxNCBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuYXNuMT09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMSl7S0pVUi5hc24xPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjEudHNwPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLnRzcCl7S0pVUi5hc24xLnRzcD17fX1LSlVSLmFzbjEudHNwLkFjY3VyYWN5PWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS50c3AuQWNjdXJhY3kuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt0aGlzLnNlY29uZHM9bnVsbDt0aGlzLm1pbGxpcz1udWxsO3RoaXMubWljcm9zPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt2YXIgZz1udWxsO3ZhciBpPW51bGw7dmFyIGM9W107aWYodGhpcy5zZWNvbmRzIT1udWxsKXtlPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5zZWNvbmRzfSk7Yy5wdXNoKGUpfWlmKHRoaXMubWlsbGlzIT1udWxsKXt2YXIgaD1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMubWlsbGlzfSk7Zz1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpoLHRhZzpcIjgwXCIsZXhwbGljaXQ6ZmFsc2V9KTtjLnB1c2goZyl9aWYodGhpcy5taWNyb3MhPW51bGwpe3ZhciBmPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6dGhpcy5taWNyb3N9KTtpPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmYsdGFnOlwiODFcIixleHBsaWNpdDpmYWxzZX0pO2MucHVzaChpKX12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc2Vjb25kcz09XCJudW1iZXJcIil7dGhpcy5zZWNvbmRzPWIuc2Vjb25kc31pZih0eXBlb2YgYi5taWxsaXM9PVwibnVtYmVyXCIpe3RoaXMubWlsbGlzPWIubWlsbGlzfWlmKHR5cGVvZiBiLm1pY3Jvcz09XCJudW1iZXJcIil7dGhpcy5taWNyb3M9Yi5taWNyb3N9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5BY2N1cmFjeSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludD1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLng1MDk7dGhpcy5kSGFzaEFsZz1udWxsO3RoaXMuZEhhc2hWYWx1ZT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRIYXNoQWxnLHRoaXMuZEhhc2hWYWx1ZV19KTtyZXR1cm4gZC5nZXRFbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5oYXNoQWxnPT1cInN0cmluZ1wiKXt0aGlzLmRIYXNoQWxnPW5ldyBjLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Yi5oYXNoQWxnfSl9aWYodHlwZW9mIGIuaGFzaFZhbHVlPT1cInN0cmluZ1wiKXt0aGlzLmRIYXNoVmFsdWU9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpiLmhhc2hWYWx1ZX0pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVxPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVxLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZE1lc3NhZ2VJbXByaW50PW51bGw7dGhpcy5kUG9saWN5PW51bGw7dGhpcy5kTm9uY2U9bnVsbDt0aGlzLmNlcnRSZXE9dHJ1ZTt0aGlzLnNldE1lc3NhZ2VJbXByaW50PWZ1bmN0aW9uKGQpe2lmKGQgaW5zdGFuY2VvZiBLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50KXt0aGlzLmRNZXNzYWdlSW1wcmludD1kO3JldHVybn1pZih0eXBlb2YgZD09XCJvYmplY3RcIil7dGhpcy5kTWVzc2FnZUltcHJpbnQ9bmV3IGIuTWVzc2FnZUltcHJpbnQoZCl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRNZXNzYWdlSW1wcmludD09bnVsbCl7dGhyb3dcIm1lc3NhZ2VJbXByaW50IHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRWZXJzaW9uLHRoaXMuZE1lc3NhZ2VJbXByaW50XTtpZih0aGlzLmRQb2xpY3khPW51bGwpe2QucHVzaCh0aGlzLmRQb2xpY3kpfWlmKHRoaXMuZE5vbmNlIT1udWxsKXtkLnB1c2godGhpcy5kTm9uY2UpfWlmKHRoaXMuY2VydFJlcSl7ZC5wdXNoKG5ldyBhLkRFUkJvb2xlYW4oKSl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLm1pPT1cIm9iamVjdFwiKXt0aGlzLnNldE1lc3NhZ2VJbXByaW50KGMubWkpfWlmKHR5cGVvZiBjLnBvbGljeT09XCJvYmplY3RcIil7dGhpcy5kUG9saWN5PW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoYy5wb2xpY3kpfWlmKHR5cGVvZiBjLm5vbmNlPT1cIm9iamVjdFwiKXt0aGlzLmROb25jZT1uZXcgYS5ERVJJbnRlZ2VyKGMubm9uY2UpfWlmKHR5cGVvZiBjLmNlcnRyZXE9PVwiYm9vbGVhblwiKXt0aGlzLmNlcnRSZXE9Yy5jZXJ0cmVxfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVxLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRTVEluZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5UU1RJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGQ9S0pVUi5hc24xLng1MDk7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRWZXJzaW9uPW5ldyBhLkRFUkludGVnZXIoe1wiaW50XCI6MX0pO3RoaXMuZFBvbGljeT1udWxsO3RoaXMuZE1lc3NhZ2VJbXByaW50PW51bGw7dGhpcy5kU2VyaWFsTnVtYmVyPW51bGw7dGhpcy5kR2VuVGltZT1udWxsO3RoaXMuZEFjY3VyYWN5PW51bGw7dGhpcy5kT3JkZXJpbmc9bnVsbDt0aGlzLmROb25jZT1udWxsO3RoaXMuZFRzYT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPVt0aGlzLmRWZXJzaW9uXTtpZih0aGlzLmRQb2xpY3k9PW51bGwpe3Rocm93XCJwb2xpY3kgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRQb2xpY3kpO2lmKHRoaXMuZE1lc3NhZ2VJbXByaW50PT1udWxsKXt0aHJvd1wibWVzc2FnZUltcHJpbnQgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRNZXNzYWdlSW1wcmludCk7aWYodGhpcy5kU2VyaWFsTnVtYmVyPT1udWxsKXt0aHJvd1wic2VyaWFsTnVtYmVyIHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kU2VyaWFsTnVtYmVyKTtpZih0aGlzLmRHZW5UaW1lPT1udWxsKXt0aHJvd1wiZ2VuVGltZSBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZEdlblRpbWUpO2lmKHRoaXMuZEFjY3VyYWN5IT1udWxsKXtlLnB1c2godGhpcy5kQWNjdXJhY3kpfWlmKHRoaXMuZE9yZGVyaW5nIT1udWxsKXtlLnB1c2godGhpcy5kT3JkZXJpbmcpfWlmKHRoaXMuZE5vbmNlIT1udWxsKXtlLnB1c2godGhpcy5kTm9uY2UpfWlmKHRoaXMuZFRzYSE9bnVsbCl7ZS5wdXNoKHRoaXMuZFRzYSl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnBvbGljeT09XCJzdHJpbmdcIil7aWYoIWMucG9saWN5Lm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcInBvbGljeSBzaGFsbCBiZSBvaWQgbGlrZSAwLjEuNC4xMzRcIn10aGlzLmRQb2xpY3k9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmMucG9saWN5fSl9aWYodHlwZW9mIGMubWVzc2FnZUltcHJpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuZE1lc3NhZ2VJbXByaW50PW5ldyBiLk1lc3NhZ2VJbXByaW50KGMubWVzc2FnZUltcHJpbnQpfWlmKHR5cGVvZiBjLnNlcmlhbE51bWJlciE9XCJ1bmRlZmluZWRcIil7dGhpcy5kU2VyaWFsTnVtYmVyPW5ldyBhLkRFUkludGVnZXIoYy5zZXJpYWxOdW1iZXIpfWlmKHR5cGVvZiBjLmdlblRpbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuZEdlblRpbWU9bmV3IGEuREVSR2VuZXJhbGl6ZWRUaW1lKGMuZ2VuVGltZSl9aWYodHlwZW9mIGMuYWNjdXJhY3khPVwidW5kZWZpbmRcIil7dGhpcy5kQWNjdXJhY3k9bmV3IGIuQWNjdXJhY3koYy5hY2N1cmFjeSl9aWYodHlwZW9mIGMub3JkZXJpbmchPVwidW5kZWZpbmVkXCImJmMub3JkZXJpbmc9PXRydWUpe3RoaXMuZE9yZGVyaW5nPW5ldyBhLkRFUkJvb2xlYW4oKX1pZih0eXBlb2YgYy5ub25jZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5kTm9uY2U9bmV3IGEuREVSSW50ZWdlcihjLm5vbmNlKX1pZih0eXBlb2YgYy50c2EhPVwidW5kZWZpbmVkXCIpe3RoaXMuZFRzYT1uZXcgZC5YNTAwTmFtZShjLnRzYSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UU1RJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlc3A9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRTdGF0dXM9bnVsbDt0aGlzLmRUU1Q9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRTdGF0dXM9PW51bGwpe3Rocm93XCJzdGF0dXMgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGQ9W3RoaXMuZFN0YXR1c107aWYodGhpcy5kVFNUIT1udWxsKXtkLnB1c2godGhpcy5kVFNUKX12YXIgZT1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZH0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMuc3RhdHVzPT1cIm9iamVjdFwiKXt0aGlzLmRTdGF0dXM9bmV3IGIuUEtJU3RhdHVzSW5mbyhjLnN0YXR1cyl9aWYodHlwZW9mIGMudHN0IT1cInVuZGVmaW5lZFwiJiZjLnRzdCBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt0aGlzLmRUU1Q9Yy50c3QuZ2V0Q29udGVudEluZm8oKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlc3AsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMuZFN0YXR1cz1udWxsO3RoaXMuZFN0YXR1c1N0cmluZz1udWxsO3RoaXMuZEZhaWx1cmVJbmZvPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU3RhdHVzPT1udWxsKXt0aHJvd1wic3RhdHVzIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRTdGF0dXNdO2lmKHRoaXMuZFN0YXR1c1N0cmluZyE9bnVsbCl7ZC5wdXNoKHRoaXMuZFN0YXR1c1N0cmluZyl9aWYodGhpcy5kRmFpbHVyZUluZm8hPW51bGwpe2QucHVzaCh0aGlzLmRGYWlsdXJlSW5mbyl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnN0YXR1cz09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzPW5ldyBiLlBLSVN0YXR1cyhjLnN0YXR1cyl9aWYodHlwZW9mIGMuc3RhdHN0cj09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzU3RyaW5nPW5ldyBiLlBLSUZyZWVUZXh0KHthcnJheTpjLnN0YXRzdHJ9KX1pZih0eXBlb2YgYy5mYWlsaW5mbz09XCJvYmplY3RcIil7dGhpcy5kRmFpbHVyZUluZm89bmV3IGIuUEtJRmFpbHVyZUluZm8oYy5mYWlsaW5mbyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cz1mdW5jdGlvbihlKXtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dmFyIGQ9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt0aGlzLmhUTFY9dGhpcy5kU3RhdHVzLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUubmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIGM9Yi5QS0lTdGF0dXMudmFsdWVMaXN0O2lmKHR5cGVvZiBjW2UubmFtZV09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJuYW1lIHVuZGVmaW5lZDogXCIrZS5uYW1lfXRoaXMuZFN0YXR1cz1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOmNbZS5uYW1lXX0pfWVsc2V7dGhpcy5kU3RhdHVzPW5ldyBhLkRFUkludGVnZXIoZSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5QS0lTdGF0dXMsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJU3RhdHVzLnZhbHVlTGlzdD17Z3JhbnRlZDowLGdyYW50ZWRXaXRoTW9kczoxLHJlamVjdGlvbjoyLHdhaXRpbmc6MyxyZXZvY2F0aW9uV2FybmluZzo0LHJldm9jYXRpb25Ob3RpZmljYXRpb246NX07S0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dD1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dGhpcy50ZXh0TGlzdD1bXTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgYz1bXTtmb3IodmFyIGU9MDtlPHRoaXMudGV4dExpc3QubGVuZ3RoO2UrKyl7Yy5wdXNoKG5ldyBhLkRFUlVURjhTdHJpbmcoe3N0cjp0aGlzLnRleHRMaXN0W2VdfSkpfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpjfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hcnJheT09XCJvYmplY3RcIil7dGhpcy50ZXh0TGlzdD1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm89ZnVuY3Rpb24oZCl7S0pVUi5hc24xLnRzcC5QS0lGYWlsdXJlSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy52YWx1ZT1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMudmFsdWU9PW51bGwpe3Rocm93XCJ2YWx1ZSBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZT1uZXcgTnVtYmVyKHRoaXMudmFsdWUpLnRvU3RyaW5nKDIpO3ZhciBmPW5ldyBhLkRFUkJpdFN0cmluZygpO2Yuc2V0QnlCaW5hcnlTdHJpbmcoZSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZC5uYW1lPT1cInN0cmluZ1wiKXt2YXIgYz1iLlBLSUZhaWx1cmVJbmZvLnZhbHVlTGlzdDtpZih0eXBlb2YgY1tkLm5hbWVdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wibmFtZSB1bmRlZmluZWQ6IFwiK2QubmFtZX10aGlzLnZhbHVlPWNbZC5uYW1lXX1lbHNle2lmKHR5cGVvZiBkW1wiaW50XCJdPT1cIm51bWJlclwiKXt0aGlzLnZhbHVlPWRbXCJpbnRcIl19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8udmFsdWVMaXN0PXtiYWRBbGc6MCxiYWRSZXF1ZXN0OjIsYmFkRGF0YUZvcm1hdDo1LHRpbWVOb3RBdmFpbGFibGU6MTQsdW5hY2NlcHRlZFBvbGljeToxNSx1bmFjY2VwdGVkRXh0ZW5zaW9uOjE2LGFkZEluZm9Ob3RBdmFpbGFibGU6MTcsc3lzdGVtRmFpbHVyZToyNX07S0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXI9ZnVuY3Rpb24oYSl7dGhpcy5nZXRUU1RIZXg9ZnVuY3Rpb24oYyxiKXt0aHJvd1wibm90IGltcGxlbWVudGVkIHlldFwifX07S0pVUi5hc24xLnRzcC5TaW1wbGVUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5wYXJhbXM9bnVsbDt0aGlzLnNlcmlhbD0wO3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dmFyIGU9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGMsYik7dGhpcy5wYXJhbXMudHN0SW5mby5tZXNzYWdlSW1wcmludD17aGFzaEFsZzpiLGhhc2hWYWx1ZTplfTt0aGlzLnBhcmFtcy50c3RJbmZvLnNlcmlhbE51bWJlcj17XCJpbnRcIjp0aGlzLnNlcmlhbCsrfTt2YXIgZD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwMCk7dGhpcy5wYXJhbXMudHN0SW5mby5ub25jZT17XCJpbnRcIjpkfTt2YXIgZj1LSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW4odGhpcy5wYXJhbXMpO3JldHVybiBmLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbXM9YX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlcixLSlVSLmFzbjEudHNwLkFic3RyYWN0VFNBQWRhcHRlcik7S0pVUi5hc24xLnRzcC5GaXhlZFRTQUFkYXB0ZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLnRzcC5GaXhlZFRTQUFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMucGFyYW1zPW51bGw7dGhpcy5nZXRUU1RIZXg9ZnVuY3Rpb24oYyxiKXt2YXIgZD1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYyxiKTt0aGlzLnBhcmFtcy50c3RJbmZvLm1lc3NhZ2VJbXByaW50PXtoYXNoQWxnOmIsaGFzaFZhbHVlOmR9O3ZhciBlPUtKVVIuYXNuMS50c3AuVFNQVXRpbC5uZXdUaW1lU3RhbXBUb2tlbih0aGlzLnBhcmFtcyk7cmV0dXJuIGUuZ2V0Q29udGVudEluZm9FbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXt0aGlzLnBhcmFtcz1hfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5GaXhlZFRTQUFkYXB0ZXIsS0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXIpO0tKVVIuYXNuMS50c3AuVFNQVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5uZXdUaW1lU3RhbXBUb2tlbj1mdW5jdGlvbihiKXt2YXIgaj1LSlVSLmFzbjEuY21zO3ZhciBhPUtKVVIuYXNuMS50c3A7dmFyIGc9bmV3IGouU2lnbmVkRGF0YSgpO3ZhciBlPW5ldyBhLlRTVEluZm8oYi50c3RJbmZvKTt2YXIgZj1lLmdldEVuY29kZWRIZXgoKTtnLmRFbmNhcENvbnRlbnRJbmZvLnNldENvbnRlbnRWYWx1ZSh7aGV4OmZ9KTtnLmRFbmNhcENvbnRlbnRJbmZvLnNldENvbnRlbnRUeXBlKFwidHN0aW5mb1wiKTtpZih0eXBlb2YgYi5jZXJ0cz09XCJvYmplY3RcIil7Zm9yKHZhciBjPTA7YzxiLmNlcnRzLmxlbmd0aDtjKyspe2cuYWRkQ2VydGlmaWNhdGVzQnlQRU0oYi5jZXJ0c1tjXSl9fXZhciBkPWcuc2lnbmVySW5mb0xpc3RbMF07ZC5zZXRTaWduZXJJZGVudGlmaWVyKGIuc2lnbmVyQ2VydCk7ZC5zZXRGb3JDb250ZW50QW5kSGFzaCh7c2RPYmo6ZyxlY2lPYmo6Zy5kRW5jYXBDb250ZW50SW5mbyxoYXNoQWxnOmIuaGFzaEFsZ30pO3ZhciBoPW5ldyBqLlNpZ25pbmdDZXJ0aWZpY2F0ZSh7YXJyYXk6W2Iuc2lnbmVyQ2VydF19KTtkLmRTaWduZWRBdHRycy5hZGQoaCk7ZC5zaWduKGIuc2lnbmVyUHJ2S2V5LGIuc2lnQWxnKTtyZXR1cm4gZ307S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlVGltZVN0YW1wUmVxPWZ1bmN0aW9uKGQpe3ZhciBmPXt9O2YuY2VydHJlcT1mYWxzZTt2YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLDApO2lmKGgubGVuZ3RoPDIpe3Rocm93XCJUaW1lU3RhbXBSZXEgbXVzdCBoYXZlIGF0IGxlYXN0IDIgaXRlbXNcIn12YXIgYz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaFsxXSk7Zi5taT1LSlVSLmFzbjEudHNwLlRTUFV0aWwucGFyc2VNZXNzYWdlSW1wcmludChjKTtmb3IodmFyIGU9MjtlPGgubGVuZ3RoO2UrKyl7dmFyIGI9aFtlXTt2YXIgYT1kLnN1YnN0cihiLDIpO2lmKGE9PVwiMDZcIil7dmFyIGc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxiKTtmLnBvbGljeT1BU04xSEVYLmhleHRvb2lkc3RyKGcpfWlmKGE9PVwiMDJcIil7Zi5ub25jZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihkLGIpfWlmKGE9PVwiMDFcIil7Zi5jZXJ0cmVxPXRydWV9fXJldHVybiBmfTtLSlVSLmFzbjEudHNwLlRTUFV0aWwucGFyc2VNZXNzYWdlSW1wcmludD1mdW5jdGlvbihjKXt2YXIgaD17fTtpZihjLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJoZWFkIG9mIG1lc3NhZ2VJbXByaW50IGhleCBzaGFsbCBiZSAnMzAnXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYywwKTt2YXIgaT1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGMsMCxbMCwwXSk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxpKTt2YXIgZT1BU04xSEVYLmhleHRvb2lkc3RyKGQpO3ZhciBnPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShlKTtpZihnPT1cIlwiKXt0aHJvd1wiaGFzaEFsZyBuYW1lIHVuZGVmaW5lZDogXCIrZX12YXIgYj1nO3ZhciBmPUFTTjFIRVguZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoYywwLFsxXSk7aC5oYXNoQWxnPWI7aC5oYXNoVmFsdWU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxmKTtyZXR1cm4gaH07XG4vKiEgYXNuMWNhZGVzLTEuMC4wLmpzIChjKSAyMDEzLTIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLmNhZGVzPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLmNhZGVzKXtLSlVSLmFzbjEuY2FkZXM9e319S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4xNVwiO3ZhciBiPUtKVVIuYXNuMTt2YXIgZD1LSlVSLmFzbjEuY2FkZXM7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm9pZD09XCJzdHJpbmdcIiYmdHlwZW9mIGUuaGFzaD09XCJvYmplY3RcIil7dmFyIGY9bmV3IGIuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmUub2lkfSk7dmFyIGE9bmV3IGQuT3RoZXJIYXNoQWxnQW5kVmFsdWUoZS5oYXNoKTt2YXIgYz1uZXcgYi5ERVJTZXF1ZW5jZSh7YXJyYXk6W2YsYV19KTt0aGlzLnZhbHVlTGlzdD1bY119fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVBvbGljeUlkZW50aWZpZXIsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEueDUwOTt0aGlzLmRBbGc9bnVsbDt0aGlzLmRIYXNoPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRBbGcsdGhpcy5kSGFzaF19KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFsZz09XCJzdHJpbmdcIiYmdHlwZW9mIGIuaGFzaD09XCJzdHJpbmdcIil7dGhpcy5kQWxnPW5ldyBjLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Yi5hbGd9KTt0aGlzLmRIYXNoPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Yi5oYXNofSl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVUaW1lU3RhbXAuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4xNFwiO3RoaXMudHN0SGV4PW51bGw7dmFyIGE9S0pVUi5hc24xO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5yZXMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnJlcz09XCJzdHJpbmdcIiYmYy5yZXMubWF0Y2goL15bMC05QS1GYS1mXSskLykpe31lbHNle2lmKGMucmVzIGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe31lbHNle3Rocm93XCJyZXMgcGFyYW0gc2hhbGwgYmUgQVNOMU9iamVjdCBvciBoZXggc3RyaW5nXCJ9fX1pZih0eXBlb2YgYy50c3QhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnRzdD09XCJzdHJpbmdcIiYmYy50c3QubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3ZhciBiPW5ldyBhLkFTTjFPYmplY3QoKTt0aGlzLnRzdEhleD1jLnRzdDtiLmhUTFY9dGhpcy50c3RIZXg7Yi5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2JdfWVsc2V7aWYoYy50c3QgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7fWVsc2V7dGhyb3dcInRzdCBwYXJhbSBzaGFsbCBiZSBBU04xT2JqZWN0IG9yIGhleCBzdHJpbmdcIn19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVUaW1lU3RhbXAsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jYWRlcy5Db21wbGV0ZUNlcnRpZmljYXRlUmVmcz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXR0clR5cGVPaWQ9XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMi4yMVwiO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5zZXRCeUFycmF5PWZ1bmN0aW9uKGQpe3RoaXMudmFsdWVMaXN0PVtdO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1uZXcgYi5PdGhlckNlcnRJRChkW2VdKTt0aGlzLnZhbHVlTGlzdC5wdXNoKGYpfX07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cIm9iamVjdFwiJiZ0eXBlb2YgYy5sZW5ndGg9PVwibnVtYmVyXCIpe3RoaXMuc2V0QnlBcnJheShjKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnMsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckNlcnRJRD1mdW5jdGlvbihkKXtLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYz1LSlVSLmFzbjEuY21zO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLmhhc0lzc3VlclNlcmlhbD10cnVlO3RoaXMuZE90aGVyQ2VydEhhc2g9bnVsbDt0aGlzLmRJc3N1ZXJTZXJpYWw9bnVsbDt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihlKXt0aGlzLmRPdGhlckNlcnRIYXNoPW5ldyBiLk90aGVySGFzaChlKTtpZih0aGlzLmhhc0lzc3VlclNlcmlhbCl7dGhpcy5kSXNzdWVyU2VyaWFsPW5ldyBjLklzc3VlckFuZFNlcmlhbE51bWJlcihlKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn1pZih0aGlzLmRPdGhlckNlcnRIYXNoPT1udWxsKXt0aHJvd1wib3RoZXJDZXJ0SGFzaCBub3Qgc2V0XCJ9dmFyIGU9W3RoaXMuZE90aGVyQ2VydEhhc2hdO2lmKHRoaXMuZElzc3VlclNlcmlhbCE9bnVsbCl7ZS5wdXNoKHRoaXMuZElzc3VlclNlcmlhbCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmV9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBkPT1cInN0cmluZ1wiJiZkLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGQpfWlmKHR5cGVvZiBkPT1cIm9iamVjdFwiKXtpZihkLmhhc2lzPT09ZmFsc2Upe3RoaXMuaGFzSXNzdWVyU2VyaWFsPWZhbHNlfWlmKHR5cGVvZiBkLmNlcnQ9PVwic3RyaW5nXCIpe3RoaXMuc2V0QnlDZXJ0UEVNKGQuY2VydCl9fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckNlcnRJRCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaD1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuYWxnPVwic2hhMjU2XCI7dGhpcy5kT3RoZXJIYXNoPW51bGw7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oZCl7aWYoZC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIik9PS0xKXt0aHJvd1wiY2VydFBFTSBub3QgdG8gc2VlbSBQRU0gZm9ybWF0XCJ9dmFyIGU9WDUwOS5wZW1Ub0hleChkKTt2YXIgZj1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoZSx0aGlzLmFsZyk7dGhpcy5kT3RoZXJIYXNoPW5ldyBiLk90aGVySGFzaEFsZ0FuZFZhbHVlKHthbGc6dGhpcy5hbGcsaGFzaDpmfSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZE90aGVySGFzaD09bnVsbCl7dGhyb3dcIk90aGVySGFzaCBub3Qgc2V0XCJ9cmV0dXJuIHRoaXMuZE90aGVySGFzaC5nZXRFbmNvZGVkSGV4KCl9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIil7aWYoYy5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShjKX1lbHNle2lmKGMubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3RoaXMuZE90aGVySGFzaD1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmN9KX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBzdHJpbmcgdmFsdWUgZm9yIHBhcmFtc1wifX19ZWxzZXtpZih0eXBlb2YgYz09XCJvYmplY3RcIil7aWYodHlwZW9mIGMuY2VydD09XCJzdHJpbmdcIil7aWYodHlwZW9mIGMuYWxnPT1cInN0cmluZ1wiKXt0aGlzLmFsZz1jLmFsZ310aGlzLnNldEJ5Q2VydFBFTShjLmNlcnQpfWVsc2V7dGhpcy5kT3RoZXJIYXNoPW5ldyBiLk90aGVySGFzaEFsZ0FuZFZhbHVlKGMpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLk90aGVySGFzaCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwuYWRkU2lnVFM9ZnVuY3Rpb24oYyxiLGEpe307S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbC5wYXJzZVNpZ25lZERhdGFGb3JBZGRpbmdVbnNpZ25lZD1mdW5jdGlvbihkKXt2YXIgcT1LSlVSLmFzbjE7dmFyIHA9S0pVUi5hc24xLmNtczt2YXIgYz1LSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsO3ZhciBhPXt9O2lmKEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KGQsMCxbMF0pIT1cIjA2MDkyYTg2NDg4NmY3MGQwMTA3MDJcIil7dGhyb3dcImhleCBpcyBub3QgQ01TIFNpZ25lZERhdGFcIn12YXIgcz1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsMCxbMSwwXSk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxzKTtpZihiLmxlbmd0aDw0KXt0aHJvd1wibnVtIG9mIFNpZ25lZERhdGEgZWxlbSBzaGFsbCBiZSA0IGF0IGxlYXN0XCJ9dmFyIGY9Yi5zaGlmdCgpO2EudmVyc2lvbj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsZik7dmFyIGw9Yi5zaGlmdCgpO2EuYWxncz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbCk7dmFyIG09Yi5zaGlmdCgpO2EuZW5jYXBjb250ZW50PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxtKTthLmNlcnRzPW51bGw7YS5yZXZzPW51bGw7YS5zaT1bXTt2YXIgbj1iLnNoaWZ0KCk7aWYoZC5zdWJzdHIobiwyKT09XCJhMFwiKXthLmNlcnRzPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTtuPWIuc2hpZnQoKX1pZihkLnN1YnN0cihuLDIpPT1cImExXCIpe2EucmV2cz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7bj1iLnNoaWZ0KCl9dmFyIGs9bjtpZihkLnN1YnN0cihrLDIpIT1cIjMxXCIpe3Rocm93XCJDYW4ndCBmaW5kIHNpZ25lckluZm9zXCJ9dmFyIGo9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxrKTtmb3IodmFyIGg9MDtoPGoubGVuZ3RoO2grKyl7dmFyIG89altoXTt2YXIgZT1jLnBhcnNlU2lnbmVySW5mb0ZvckFkZGluZ1Vuc2lnbmVkKGQsbyxoKTthLnNpW2hdPWV9dmFyIGc9bnVsbDthLm9iaj1uZXcgcC5TaWduZWREYXRhKCk7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEudmVyc2lvbjthLm9iai5kQ01TVmVyc2lvbj1nO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLmFsZ3M7YS5vYmouZERpZ2VzdEFsZ3M9ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5lbmNhcGNvbnRlbnQ7YS5vYmouZEVuY2FwQ29udGVudEluZm89ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5jZXJ0czthLm9iai5kQ2VydHM9ZzthLm9iai5zaWduZXJJbmZvTGlzdD1bXTtmb3IodmFyIGg9MDtoPGEuc2kubGVuZ3RoO2grKyl7YS5vYmouc2lnbmVySW5mb0xpc3QucHVzaChhLnNpW2hdLm9iail9cmV0dXJuIGF9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwucGFyc2VTaWduZXJJbmZvRm9yQWRkaW5nVW5zaWduZWQ9ZnVuY3Rpb24oZCxrLGEpe3ZhciBtPUtKVVIuYXNuMTt2YXIgbD1LSlVSLmFzbjEuY21zO3ZhciBiPXt9O3ZhciBlPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsayk7aWYoZS5sZW5ndGghPTYpe3Rocm93XCJub3Qgc3VwcG9ydGVkIGl0ZW1zIGZvciBTaWduZXJJbmZvICghPTYpXCJ9dmFyIGY9ZS5zaGlmdCgpO2IudmVyc2lvbj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsZik7dmFyIG49ZS5zaGlmdCgpO2Iuc2k9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO3ZhciBoPWUuc2hpZnQoKTtiLmRpZ2FsZz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaCk7dmFyIGM9ZS5zaGlmdCgpO2Iuc2F0dHJzPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxjKTt2YXIgaT1lLnNoaWZ0KCk7Yi5zaWdhbGc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGkpO3ZhciBqPWUuc2hpZnQoKTtiLnNpZz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsaik7Yi5zaWd2YWw9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxqKTt2YXIgZz1udWxsO2Iub2JqPW5ldyBsLlNpZ25lckluZm8oKTtnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi52ZXJzaW9uO2Iub2JqLmRDTVNWZXJzaW9uPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2k7Yi5vYmouZFNpZ25lcklkZW50aWZpZXI9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5kaWdhbGc7Yi5vYmouZERpZ2VzdEFsZ29yaXRobT1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNhdHRycztiLm9iai5kU2lnbmVkQXR0cnM9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaWdhbGc7Yi5vYmouZFNpZ0FsZz1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpZztiLm9iai5kU2lnPWc7Yi5vYmouZFVuc2lnbmVkQXR0cnM9bmV3IGwuQXR0cmlidXRlTGlzdCgpO3JldHVybiBifTtcbi8qISBhc24xY3NyLTEuMC4wLmpzIChjKSAyMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSLmFzbjEuY3NyPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xLmNzcil7S0pVUi5hc24xLmNzcj17fX1LSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0PWZ1bmN0aW9uKGYpe0tKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt2YXIgZT1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNpZ249ZnVuY3Rpb24oaSxoKXtpZih0aGlzLnBydktleT09bnVsbCl7dGhpcy5wcnZLZXk9aH10aGlzLmFzbjFTaWduYXR1cmVBbGc9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6aX0pO3NpZz1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6aX0pO3NpZy5pbml0U2lnbih0aGlzLnBydktleSk7c2lnLnVwZGF0ZUhleCh0aGlzLmFzbjFDU1JJbmZvLmdldEVuY29kZWRIZXgoKSk7dGhpcy5oZXhTaWc9c2lnLnNpZ24oKTt0aGlzLmFzbjFTaWc9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrdGhpcy5oZXhTaWd9KTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xQ1NSSW5mbyx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0UEVNU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgodGhpcy5nZXRFbmNvZGVkSGV4KCksXCJDRVJUSUZJQ0FURSBSRVFVRVNUXCIpO3JldHVybiBnfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW9kaWZpZWQ9PWZhbHNlJiZ0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9dGhyb3dcIm5vdCBzaWduZWQgeWV0XCJ9O2lmKHR5cGVvZiBmIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZi5jc3JpbmZvIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFDU1JJbmZvPWYuY3NyaW5mb319fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbz1mdW5jdGlvbihhKXtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0SW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5faW5pdGlhbGl6ZT1mdW5jdGlvbigpe3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYXNuMVZlcnNpb249bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjB9KTt0aGlzLmFzbjFTdWJqZWN0PW51bGw7dGhpcy5hc24xU3VialBLZXk9bnVsbDt0aGlzLmV4dGVuc2lvbnNBcnJheT1uZXcgQXJyYXkoKX07dGhpcy5zZXRTdWJqZWN0QnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFTdWJqZWN0PW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXk9ZnVuY3Rpb24oYyl7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYyk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3ViamVjdCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqUEtleSk7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5leHRlbnNpb25zQXJyYXl9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiYTBcIixvYmo6Y30pO3RoaXMuYXNuMUFycmF5LnB1c2goYik7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hc24xQXJyYXl9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jc3IuQ1NSVXRpbD1uZXcgZnVuY3Rpb24oKXt9O0tKVVIuYXNuMS5jc3IuQ1NSVXRpbC5uZXdDU1JQRU09ZnVuY3Rpb24oZil7dmFyIGM9S0pVUi5hc24xLmNzcjtpZihmLnN1YmplY3Q9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc3ViamVjdCB1bmRlZmluZWRcIn1pZihmLnNianB1YmtleT09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzYmpwdWJrZXkgdW5kZWZpbmVkXCJ9aWYoZi5zaWdhbGc9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2lnYWxnIHVuZGVmaW5lZFwifWlmKGYuc2JqcHJ2a2V5PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNianB1YmtleSB1bmRlZmluZWRcIn12YXIgYj1uZXcgYy5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8oKTtiLnNldFN1YmplY3RCeVBhcmFtKGYuc3ViamVjdCk7Yi5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXkoZi5zYmpwdWJrZXkpO3ZhciBkPW5ldyBjLkNlcnRpZmljYXRpb25SZXF1ZXN0KHtjc3JpbmZvOmJ9KTt2YXIgYT1LRVlVVElMLmdldEtleShmLnNianBydmtleSk7ZC5zaWduKGYuc2lnYWxnLGEpO3ZhciBlPWQuZ2V0UEVNU3RyaW5nKCk7cmV0dXJuIGV9O1xuLyohIGJhc2U2NHgtMS4xLjYgKGMpIDIwMTItMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiBCYXNlNjR4KCl7fWZ1bmN0aW9uIHN0b0JBKGQpe3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtiW2NdPWQuY2hhckNvZGVBdChjKX1yZXR1cm4gYn1mdW5jdGlvbiBCQXRvcyhiKXt2YXIgZD1cIlwiO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWQrU3RyaW5nLmZyb21DaGFyQ29kZShiW2NdKX1yZXR1cm4gZH1mdW5jdGlvbiBCQXRvaGV4KGIpe3ZhciBlPVwiXCI7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF0udG9TdHJpbmcoMTYpO2lmKGMubGVuZ3RoPT0xKXtjPVwiMFwiK2N9ZT1lK2N9cmV0dXJuIGV9ZnVuY3Rpb24gc3RvaGV4KGEpe3JldHVybiBCQXRvaGV4KHN0b0JBKGEpKX1mdW5jdGlvbiBzdG9iNjQoYSl7cmV0dXJuIGhleDJiNjQoc3RvaGV4KGEpKX1mdW5jdGlvbiBzdG9iNjR1KGEpe3JldHVybiBiNjR0b2I2NHUoaGV4MmI2NChzdG9oZXgoYSkpKX1mdW5jdGlvbiBiNjR1dG9zKGEpe3JldHVybiBCQXRvcyhiNjR0b0JBKGI2NHV0b2I2NChhKSkpfWZ1bmN0aW9uIGI2NHRvYjY0dShhKXthPWEucmVwbGFjZSgvXFw9L2csXCJcIik7YT1hLnJlcGxhY2UoL1xcKy9nLFwiLVwiKTthPWEucmVwbGFjZSgvXFwvL2csXCJfXCIpO3JldHVybiBhfWZ1bmN0aW9uIGI2NHV0b2I2NChhKXtpZihhLmxlbmd0aCU0PT0yKXthPWErXCI9PVwifWVsc2V7aWYoYS5sZW5ndGglND09Myl7YT1hK1wiPVwifX1hPWEucmVwbGFjZSgvLS9nLFwiK1wiKTthPWEucmVwbGFjZSgvXy9nLFwiL1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NHUoYSl7aWYoYS5sZW5ndGglMj09MSl7YT1cIjBcIithfXJldHVybiBiNjR0b2I2NHUoaGV4MmI2NChhKSl9ZnVuY3Rpb24gYjY0dXRvaGV4KGEpe3JldHVybiBiNjR0b2hleChiNjR1dG9iNjQoYSkpfXZhciB1dGY4dG9iNjR1LGI2NHV0b3V0Zjg7aWYodHlwZW9mIEJ1ZmZlcj09PVwiZnVuY3Rpb25cIil7dXRmOHRvYjY0dT1mdW5jdGlvbihhKXtyZXR1cm4gYjY0dG9iNjR1KG5ldyBCdWZmZXIoYSxcInV0ZjhcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgQnVmZmVyKGI2NHV0b2I2NChhKSxcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIil9fWVsc2V7dXRmOHRvYjY0dT1mdW5jdGlvbihhKXtyZXR1cm4gaGV4dG9iNjR1KHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSkpfTtiNjR1dG91dGY4PWZ1bmN0aW9uKGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dXRvaGV4KGEpKSl9fWZ1bmN0aW9uIHV0Zjh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NCh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX1mdW5jdGlvbiBiNjR0b3V0ZjgoYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChiNjR0b2hleChhKSkpfWZ1bmN0aW9uIHV0Zjh0b2hleChhKXtyZXR1cm4gdXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKX1mdW5jdGlvbiBoZXh0b3V0ZjgoYSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoZXh0b3VyaWNtcChhKSl9ZnVuY3Rpb24gaGV4dG9yc3RyKGMpe3ZhciBiPVwiXCI7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aC0xO2ErPTIpe2IrPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYy5zdWJzdHIoYSwyKSwxNikpfXJldHVybiBifWZ1bmN0aW9uIHJzdHJ0b2hleChjKXt2YXIgYT1cIlwiO2Zvcih2YXIgYj0wO2I8Yy5sZW5ndGg7YisrKXthKz0oXCIwXCIrYy5jaGFyQ29kZUF0KGIpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfXJldHVybiBhfWZ1bmN0aW9uIGhleHRvYjY0KGEpe3JldHVybiBoZXgyYjY0KGEpfWZ1bmN0aW9uIGhleHRvYjY0bmwoYil7dmFyIGE9aGV4dG9iNjQoYik7dmFyIGM9YS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtjPWMucmVwbGFjZSgvXFxyXFxuJC8sXCJcIik7cmV0dXJuIGN9ZnVuY3Rpb24gYjY0bmx0b2hleChiKXt2YXIgYT1iLnJlcGxhY2UoL1teMC05QS1aYS16XFwvKz1dKi9nLFwiXCIpO3ZhciBjPWI2NHRvaGV4KGEpO3JldHVybiBjfWZ1bmN0aW9uIHVyaWNtcHRvaGV4KGEpe3JldHVybiBhLnJlcGxhY2UoLyUvZyxcIlwiKX1mdW5jdGlvbiBoZXh0b3VyaWNtcChhKXtyZXR1cm4gYS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIil9ZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpe3ZhciBkPWVuY29kZVVSSUNvbXBvbmVudChhKTt2YXIgYj1cIlwiO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtpZihkW2NdPT1cIiVcIil7Yj1iK2Quc3Vic3RyKGMsMyk7Yz1jKzJ9ZWxzZXtiPWIrXCIlXCIrc3RvaGV4KGRbY10pfX1yZXR1cm4gYn1mdW5jdGlvbiBuZXdsaW5lX3RvVW5peChhKXthPWEucmVwbGFjZSgvXFxyXFxuL21nLFwiXFxuXCIpO3JldHVybiBhfWZ1bmN0aW9uIG5ld2xpbmVfdG9Eb3MoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTthPWEucmVwbGFjZSgvXFxuL21nLFwiXFxyXFxuXCIpO3JldHVybiBhfWZ1bmN0aW9uIGludGFyeXN0cnRvaGV4KGIpe2I9Yi5yZXBsYWNlKC9eXFxzKlxcW1xccyovLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqXFxdXFxzKiQvLFwiXCIpO2I9Yi5yZXBsYWNlKC9cXHMqL2csXCJcIik7dHJ5e3ZhciBjPWIuc3BsaXQoLywvKS5tYXAoZnVuY3Rpb24oZyxlLGgpe3ZhciBmPXBhcnNlSW50KGcpO2lmKGY8MHx8MjU1PGYpe3Rocm93XCJpbnRlZ2VyIG5vdCBpbiByYW5nZSAwLTI1NVwifXZhciBkPShcIjAwXCIrZi50b1N0cmluZygxNikpLnNsaWNlKC0yKTtyZXR1cm4gZH0pLmpvaW4oXCJcIik7cmV0dXJuIGN9Y2F0Y2goYSl7dGhyb3dcIm1hbGZvcm1lZCBpbnRlZ2VyIGFycmF5IHN0cmluZzogXCIrYX19dmFyIHN0cmRpZmZpZHg9ZnVuY3Rpb24oYyxhKXt2YXIgZD1jLmxlbmd0aDtpZihjLmxlbmd0aD5hLmxlbmd0aCl7ZD1hLmxlbmd0aH1mb3IodmFyIGI9MDtiPGQ7YisrKXtpZihjLmNoYXJDb2RlQXQoYikhPWEuY2hhckNvZGVBdChiKSl7cmV0dXJuIGJ9fWlmKGMubGVuZ3RoIT1hLmxlbmd0aCl7cmV0dXJuIGR9cmV0dXJuIC0xfTtcbi8qISBjcnlwdG8tMS4xLjguanMgKGMpIDIwMTMtMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLlV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5ESUdFU1RJTkZPSEVBRD17c2hhMTpcIjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNFwiLHNoYTIyNDpcIjMwMmQzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwNDA1MDAwNDFjXCIsc2hhMjU2OlwiMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjBcIixzaGEzODQ6XCIzMDQxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDIwNTAwMDQzMFwiLHNoYTUxMjpcIjMwNTEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMzA1MDAwNDQwXCIsbWQyOlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwMjA1MDAwNDEwXCIsbWQ1OlwiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwXCIscmlwZW1kMTYwOlwiMzAyMTMwMDkwNjA1MmIyNDAzMDIwMTA1MDAwNDE0XCIsfTt0aGlzLkRFRkFVTFRQUk9WSURFUj17bWQ1OlwiY3J5cHRvanNcIixzaGExOlwiY3J5cHRvanNcIixzaGEyMjQ6XCJjcnlwdG9qc1wiLHNoYTI1NjpcImNyeXB0b2pzXCIsc2hhMzg0OlwiY3J5cHRvanNcIixzaGE1MTI6XCJjcnlwdG9qc1wiLHJpcGVtZDE2MDpcImNyeXB0b2pzXCIsaG1hY21kNTpcImNyeXB0b2pzXCIsaG1hY3NoYTE6XCJjcnlwdG9qc1wiLGhtYWNzaGEyMjQ6XCJjcnlwdG9qc1wiLGhtYWNzaGEyNTY6XCJjcnlwdG9qc1wiLGhtYWNzaGEzODQ6XCJjcnlwdG9qc1wiLGhtYWNzaGE1MTI6XCJjcnlwdG9qc1wiLGhtYWNyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLE1ENXdpdGhSU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixNRDV3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aERTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTF3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEzODR3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIix9O3RoaXMuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRT17bWQ1OkNyeXB0b0pTLmFsZ28uTUQ1LHNoYTE6Q3J5cHRvSlMuYWxnby5TSEExLHNoYTIyNDpDcnlwdG9KUy5hbGdvLlNIQTIyNCxzaGEyNTY6Q3J5cHRvSlMuYWxnby5TSEEyNTYsc2hhMzg0OkNyeXB0b0pTLmFsZ28uU0hBMzg0LHNoYTUxMjpDcnlwdG9KUy5hbGdvLlNIQTUxMixyaXBlbWQxNjA6Q3J5cHRvSlMuYWxnby5SSVBFTUQxNjB9O3RoaXMuZ2V0RGlnZXN0SW5mb0hleD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiB0aGlzLkRJR0VTVElORk9IRUFEW2JdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wiYWxnIG5vdCBzdXBwb3J0ZWQgaW4gVXRpbC5ESUdFU1RJTkZPSEVBRDogXCIrYn1yZXR1cm4gdGhpcy5ESUdFU1RJTkZPSEVBRFtiXSthfTt0aGlzLmdldFBhZGRlZERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oaCxhLGope3ZhciBjPXRoaXMuZ2V0RGlnZXN0SW5mb0hleChoLGEpO3ZhciBkPWovNDtpZihjLmxlbmd0aCsyMj5kKXt0aHJvd1wia2V5IGlzIHRvbyBzaG9ydCBmb3IgU2lnQWxnOiBrZXlsZW49XCIraitcIixcIithfXZhciBiPVwiMDAwMVwiO3ZhciBrPVwiMDBcIitjO3ZhciBnPVwiXCI7dmFyIGw9ZC1iLmxlbmd0aC1rLmxlbmd0aDtmb3IodmFyIGY9MDtmPGw7Zis9Mil7Zys9XCJmZlwifXZhciBlPWIrZytrO3JldHVybiBlfTt0aGlzLmhhc2hTdHJpbmc9ZnVuY3Rpb24oYSxjKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuaGFzaEhleD1mdW5jdGlvbihiLGMpe3ZhciBhPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6Y30pO3JldHVybiBhLmRpZ2VzdEhleChiKX07dGhpcy5zaGExPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGExXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5zaGEyNTZIZXg9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTI1NlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0SGV4KGEpfTt0aGlzLnNoYTUxMj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhNTEySGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGE1MTJcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX07dGhpcy5tZDU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcIm1kNVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnJpcGVtZDE2MD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwicmlwZW1kMTYwXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuZ2V0Q3J5cHRvSlNNREJ5TmFtZT1mdW5jdGlvbihhKXt9fTtLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGMpe3ZhciBiPW51bGw7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24oZyxmKXtpZihnIT1udWxsJiZmPT09dW5kZWZpbmVkKXtmPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2ddfWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwiY3J5cHRvanNcIil7dHJ5e3RoaXMubWQ9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddLmNyZWF0ZSgpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihoKXt2YXIgaT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGgpO3RoaXMubWQudXBkYXRlKGkpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gaC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX1pZihcIjpzaGEyNTY6XCIuaW5kZXhPZihnKSE9LTEmJmY9PVwic2pjbFwiKXt0cnl7dGhpcy5tZD1uZXcgc2pjbC5oYXNoLnNoYTI1NigpfWNhdGNoKGUpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBhbGc9XCIrZytcIi9cIitlfXRoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihpKXt2YXIgaD1zamNsLmNvZGVjLmhleC50b0JpdHMoaSk7dGhpcy5tZC51cGRhdGUoaCl9O3RoaXMuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5tZC5maW5hbGl6ZSgpO3JldHVybiBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhoKX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oaCl7dGhpcy51cGRhdGVTdHJpbmcoaCk7cmV0dXJuIHRoaXMuZGlnZXN0KCl9O3RoaXMuZGlnZXN0SGV4PWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlSGV4KGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RTdHJpbmc9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihlKXt0aHJvd1wiZGlnZXN0SGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O2lmKGMhPT11bmRlZmluZWQpe2lmKGMuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9Yy5hbGc7aWYoYy5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uTWFjPWZ1bmN0aW9uKGQpe3ZhciBmPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGssaSl7az1rLnRvTG93ZXJDYXNlKCk7aWYoaz09bnVsbCl7az1cImhtYWNzaGExXCJ9az1rLnRvTG93ZXJDYXNlKCk7aWYoay5zdWJzdHIoMCw0KSE9XCJobWFjXCIpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciB1bnN1cHBvcnRlZCBITUFDIGFsZzogXCIra31pZihpPT09dW5kZWZpbmVkKXtpPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW2tdfXRoaXMuYWxnUHJvdj1rK1wiL1wiK2k7dmFyIGc9ay5zdWJzdHIoNCk7aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKGcpIT0tMSYmaT09XCJjcnlwdG9qc1wiKXt0cnl7dmFyIGo9S0pVUi5jcnlwdG8uVXRpbC5DUllQVE9KU01FU1NBR0VESUdFU1ROQU1FW2ddO3RoaXMubWFjPUNyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoaix0aGlzLnBhc3MpfWNhdGNoKGgpe3Rocm93XCJzZXRBbGdBbmRQcm92aWRlciBoYXNoIGFsZyBzZXQgZmFpbCBoYXNoQWxnPVwiK2crXCIvXCIraH10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihsKXt0aGlzLm1hYy51cGRhdGUobCl9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGwpe3ZhciBtPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UobCk7dGhpcy5tYWMudXBkYXRlKG0pfTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt2YXIgbD10aGlzLm1hYy5maW5hbGl6ZSgpO3JldHVybiBsLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpfTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVTdHJpbmcobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24obCl7dGhpcy51cGRhdGVIZXgobCk7cmV0dXJuIHRoaXMuZG9GaW5hbCgpfX19O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbD1mdW5jdGlvbigpe3Rocm93XCJkaWdlc3QoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuZG9GaW5hbFN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxIZXg9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5zZXRQYXNzd29yZD1mdW5jdGlvbihoKXtpZih0eXBlb2YgaD09XCJzdHJpbmdcIil7dmFyIGc9aDtpZihoLmxlbmd0aCUyPT0xfHwhaC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7Zz1yc3RydG9oZXgoaCl9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyk7cmV0dXJufWlmKHR5cGVvZiBoIT1cIm9iamVjdFwiKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dmFyIGc9bnVsbDtpZihoLmhleCE9PXVuZGVmaW5lZCl7aWYoaC5oZXgubGVuZ3RoJTIhPTB8fCFoLmhleC5tYXRjaCgvXlswLTlBLUZhLWZdKyQvKSl7dGhyb3dcIk1hYzogd3JvbmcgaGV4IHBhc3N3b3JkOiBcIitoLmhleH1nPWguaGV4fWlmKGgudXRmOCE9PXVuZGVmaW5lZCl7Zz11dGY4dG9oZXgoaC51dGY4KX1pZihoLnJzdHIhPT11bmRlZmluZWQpe2c9cnN0cnRvaGV4KGgucnN0cil9aWYoaC5iNjQhPT11bmRlZmluZWQpe2c9YjY0dG9oZXgoaC5iNjQpfWlmKGguYjY0dSE9PXVuZGVmaW5lZCl7Zz1iNjR1dG9oZXgoaC5iNjR1KX1pZihnPT1udWxsKXt0aHJvd1wiS0pVUi5jcnlwdG8uTWFjIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IFwiK2h9dGhpcy5wYXNzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoZyl9O2lmKGQhPT11bmRlZmluZWQpe2lmKGQucGFzcyE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQYXNzd29yZChkLnBhc3MpfWlmKGQuYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9ZC5hbGc7aWYoZC5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19dGhpcy5zZXRBbGdBbmRQcm92aWRlcih0aGlzLmFsZ05hbWUsdGhpcy5wcm92TmFtZSl9fX07S0pVUi5jcnlwdG8uU2lnbmF0dXJlPWZ1bmN0aW9uKG8pe3ZhciBxPW51bGw7dmFyIG49bnVsbDt2YXIgcj1udWxsO3ZhciBjPW51bGw7dmFyIGw9bnVsbDt2YXIgZD1udWxsO3ZhciBrPW51bGw7dmFyIGg9bnVsbDt2YXIgcD1udWxsO3ZhciBlPW51bGw7dmFyIGI9LTE7dmFyIGc9bnVsbDt2YXIgaj1udWxsO3ZhciBhPW51bGw7dmFyIGk9bnVsbDt2YXIgZj1udWxsO3RoaXMuX3NldEFsZ05hbWVzPWZ1bmN0aW9uKCl7aWYodGhpcy5hbGdOYW1lLm1hdGNoKC9eKC4rKXdpdGgoLispJC8pKXt0aGlzLm1kQWxnTmFtZT1SZWdFeHAuJDEudG9Mb3dlckNhc2UoKTt0aGlzLnB1YmtleUFsZ05hbWU9UmVnRXhwLiQyLnRvTG93ZXJDYXNlKCl9fTt0aGlzLl96ZXJvUGFkZGluZ09mU2lnbmF0dXJlPWZ1bmN0aW9uKHgsdyl7dmFyIHY9XCJcIjt2YXIgdD13LzQteC5sZW5ndGg7Zm9yKHZhciB1PTA7dTx0O3UrKyl7dj12K1wiMFwifXJldHVybiB2K3h9O3RoaXMuc2V0QWxnQW5kUHJvdmlkZXI9ZnVuY3Rpb24odSx0KXt0aGlzLl9zZXRBbGdOYW1lcygpO2lmKHQhPVwiY3J5cHRvanMvanNyc2FcIil7dGhyb3dcInByb3ZpZGVyIG5vdCBzdXBwb3J0ZWQ6IFwiK3R9aWYoXCI6bWQ1OnNoYTE6c2hhMjI0OnNoYTI1NjpzaGEzODQ6c2hhNTEyOnJpcGVtZDE2MDpcIi5pbmRleE9mKHRoaXMubWRBbGdOYW1lKSE9LTEpe3RyeXt0aGlzLm1kPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6dGhpcy5tZEFsZ05hbWV9KX1jYXRjaChzKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK3RoaXMubWRBbGdOYW1lK1wiL1wiK3N9dGhpcy5pbml0PWZ1bmN0aW9uKHcseCl7dmFyIHk9bnVsbDt0cnl7aWYoeD09PXVuZGVmaW5lZCl7eT1LRVlVVElMLmdldEtleSh3KX1lbHNle3k9S0VZVVRJTC5nZXRLZXkodyx4KX19Y2F0Y2godil7dGhyb3dcImluaXQgZmFpbGVkOlwiK3Z9aWYoeS5pc1ByaXZhdGU9PT10cnVlKXt0aGlzLnBydktleT15O3RoaXMuc3RhdGU9XCJTSUdOXCJ9ZWxzZXtpZih5LmlzUHVibGljPT09dHJ1ZSl7dGhpcy5wdWJLZXk9eTt0aGlzLnN0YXRlPVwiVkVSSUZZXCJ9ZWxzZXt0aHJvd1wiaW5pdCBmYWlsZWQuOlwiK3l9fX07dGhpcy5pbml0U2lnbj1mdW5jdGlvbih2KXtpZih0eXBlb2Ygdi5lY3BydmhleD09XCJzdHJpbmdcIiYmdHlwZW9mIHYuZWNjdXJ2ZW5hbWU9PVwic3RyaW5nXCIpe3RoaXMuZWNwcnZoZXg9di5lY3BydmhleDt0aGlzLmVjY3VydmVuYW1lPXYuZWNjdXJ2ZW5hbWV9ZWxzZXt0aGlzLnBydktleT12fXRoaXMuc3RhdGU9XCJTSUdOXCJ9O3RoaXMuaW5pdFZlcmlmeUJ5UHVibGljS2V5PWZ1bmN0aW9uKHYpe2lmKHR5cGVvZiB2LmVjcHViaGV4PT1cInN0cmluZ1wiJiZ0eXBlb2Ygdi5lY2N1cnZlbmFtZT09XCJzdHJpbmdcIil7dGhpcy5lY3B1YmhleD12LmVjcHViaGV4O3RoaXMuZWNjdXJ2ZW5hbWU9di5lY2N1cnZlbmFtZX1lbHNle2lmKHYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5wdWJLZXk9dn1lbHNle2lmKHYgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMucHViS2V5PXZ9fX10aGlzLnN0YXRlPVwiVkVSSUZZXCJ9O3RoaXMuaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU09ZnVuY3Rpb24odil7dmFyIHc9bmV3IFg1MDkoKTt3LnJlYWRDZXJ0UEVNKHYpO3RoaXMucHViS2V5PXcuc3ViamVjdFB1YmxpY0tleVJTQTt0aGlzLnN0YXRlPVwiVkVSSUZZXCJ9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMubWQudXBkYXRlU3RyaW5nKHYpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZUhleCh2KX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHJ2aGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7dGhpcy5oU2lnbj12LnNpZ25IZXgodGhpcy5zSGFzaEhleCx0aGlzLmVjcHJ2aGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhYW5kbWdmMVwiKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2hQU1ModGhpcy5zSGFzaEhleCx0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgpfWVsc2V7aWYodGhpcy5wcnZLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4KX1lbHNle3Rocm93XCJTaWduYXR1cmU6IHVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fXJldHVybiB0aGlzLmhTaWdufTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVTdHJpbmcodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24odil7dGhpcy51cGRhdGVIZXgodik7cmV0dXJuIHRoaXMuc2lnbigpfTt0aGlzLnZlcmlmeT1mdW5jdGlvbih2KXt0aGlzLnNIYXNoSGV4PXRoaXMubWQuZGlnZXN0KCk7aWYodHlwZW9mIHRoaXMuZWNwdWJoZXghPVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLmVjY3VydmVuYW1lIT1cInVuZGVmaW5lZFwiKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnRoaXMuZWNjdXJ2ZW5hbWV9KTtyZXR1cm4gdy52ZXJpZnlIZXgodGhpcy5zSGFzaEhleCx2LHRoaXMuZWNwdWJoZXgpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FhbmRtZ2YxXCIpe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1ModGhpcy5zSGFzaEhleCx2LHRoaXMubWRBbGdOYW1lLHRoaXMucHNzU2FsdExlbil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoKHRoaXMuc0hhc2hIZXgsdil9ZWxzZXtpZih0aGlzLnB1YktleSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7dGhyb3dcIlNpZ25hdHVyZTogdW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGc6IFwiK3RoaXMucHVia2V5QWxnTmFtZX19fX19fX19O3RoaXMuaW5pdD1mdW5jdGlvbihzLHQpe3Rocm93XCJpbml0KGtleSwgcGFzcykgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRWZXJpZnlCeVB1YmxpY0tleT1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFZlcmlmeUJ5UHVibGljS2V5KHJzYVB1YktleXkpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0VmVyaWZ5QnlDZXJ0aWZpY2F0ZVBFTT1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU0oY2VydFBFTSkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRTaWduPWZ1bmN0aW9uKHMpe3Rocm93XCJpbml0U2lnbihwcnZLZXkpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcInVwZGF0ZVN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24ocyl7dGhyb3dcInVwZGF0ZUhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhyb3dcInNpZ24oKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnblN0cmluZz1mdW5jdGlvbihzKXt0aHJvd1wiZGlnZXN0U3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24ocyl7dGhyb3dcInZlcmlmeShoU2lnVmFsKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFBhcmFtcz1vO2lmKG8hPT11bmRlZmluZWQpe2lmKG8uYWxnIT09dW5kZWZpbmVkKXt0aGlzLmFsZ05hbWU9by5hbGc7aWYoby5wcm92PT09dW5kZWZpbmVkKXt0aGlzLnByb3ZOYW1lPUtKVVIuY3J5cHRvLlV0aWwuREVGQVVMVFBST1ZJREVSW3RoaXMuYWxnTmFtZV19ZWxzZXt0aGlzLnByb3ZOYW1lPW8ucHJvdn10aGlzLmFsZ1Byb3ZOYW1lPXRoaXMuYWxnTmFtZStcIjpcIit0aGlzLnByb3ZOYW1lO3RoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpO3RoaXMuX3NldEFsZ05hbWVzKCl9aWYoby5wc3NzYWx0bGVuIT09dW5kZWZpbmVkKXt0aGlzLnBzc1NhbHRMZW49by5wc3NzYWx0bGVufWlmKG8ucHJ2a2V5cGVtIT09dW5kZWZpbmVkKXtpZihvLnBydmtleXBhcyE9PXVuZGVmaW5lZCl7dGhyb3dcImJvdGggcHJ2a2V5cGVtIGFuZCBwcnZrZXlwYXMgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkXCJ9ZWxzZXt0cnl7dmFyIHE9bmV3IFJTQUtleSgpO3EucmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nKG8ucHJ2a2V5cGVtKTt0aGlzLmluaXRTaWduKHEpfWNhdGNoKG0pe3Rocm93XCJmYXRhbCBlcnJvciB0byBsb2FkIHBlbSBwcml2YXRlIGtleTogXCIrbX19fX19O0tKVVIuY3J5cHRvLk9JRD1uZXcgZnVuY3Rpb24oKXt0aGlzLm9pZGhleDJuYW1lPXtcIjJhODY0ODg2ZjcwZDAxMDEwMVwiOlwicnNhRW5jcnlwdGlvblwiLFwiMmE4NjQ4Y2UzZDAyMDFcIjpcImVjUHVibGljS2V5XCIsXCIyYTg2NDhjZTM4MDQwMVwiOlwiZHNhXCIsXCIyYTg2NDhjZTNkMDMwMTA3XCI6XCJzZWNwMjU2cjFcIixcIjJiODEwNDAwMWZcIjpcInNlY3AxOTJrMVwiLFwiMmI4MTA0MDAyMVwiOlwic2VjcDIyNHIxXCIsXCIyYjgxMDQwMDBhXCI6XCJzZWNwMjU2azFcIixcIjJiODEwNDAwMjNcIjpcInNlY3A1MjFyMVwiLFwiMmI4MTA0MDAyMlwiOlwic2VjcDM4NHIxXCIsXCIyYTg2NDhjZTM4MDQwM1wiOlwiU0hBMXdpdGhEU0FcIixcIjYwODY0ODAxNjUwMzA0MDMwMVwiOlwiU0hBMjI0d2l0aERTQVwiLFwiNjA4NjQ4MDE2NTAzMDQwMzAyXCI6XCJTSEEyNTZ3aXRoRFNBXCIsfX07XG4vKiEgZWNkc2EtbW9kaWZpZWQtMS4wLjQuanMgKGMpIFN0ZXBoYW4gVGhvbWFzLCBLZW5qaSBVcnVzaGltYSB8IGdpdGh1Yi5jb20vYml0Y29pbmpzL2JpdGNvaW5qcy1saWIvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDRFNBPWZ1bmN0aW9uKGgpe3ZhciBlPVwic2VjcDI1NnIxXCI7dmFyIGc9bnVsbDt2YXIgYj1udWxsO3ZhciBmPW51bGw7dmFyIGE9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBkPW51bGw7dGhpcy50eXBlPVwiRUNcIjtmdW5jdGlvbiBjKHMsbyxyLG4pe3ZhciBqPU1hdGgubWF4KG8uYml0TGVuZ3RoKCksbi5iaXRMZW5ndGgoKSk7dmFyIHQ9cy5hZGQyRChyKTt2YXIgcT1zLmN1cnZlLmdldEluZmluaXR5KCk7Zm9yKHZhciBwPWotMTtwPj0wOy0tcCl7cT1xLnR3aWNlMkQoKTtxLno9QmlnSW50ZWdlci5PTkU7aWYoby50ZXN0Qml0KHApKXtpZihuLnRlc3RCaXQocCkpe3E9cS5hZGQyRCh0KX1lbHNle3E9cS5hZGQyRChzKX19ZWxzZXtpZihuLnRlc3RCaXQocCkpe3E9cS5hZGQyRChyKX19fXJldHVybiBxfXRoaXMuZ2V0QmlnUmFuZG9tPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcgQmlnSW50ZWdlcihpLmJpdExlbmd0aCgpLGEpLm1vZChpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSkuYWRkKEJpZ0ludGVnZXIuT05FKX07dGhpcy5zZXROYW1lZEN1cnZlPWZ1bmN0aW9uKGkpe3RoaXMuZWNwYXJhbXM9S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5nZXRCeU5hbWUoaSk7dGhpcy5wcnZLZXlIZXg9bnVsbDt0aGlzLnB1YktleUhleD1udWxsO3RoaXMuY3VydmVOYW1lPWl9O3RoaXMuc2V0UHJpdmF0ZUtleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHJpdmF0ZT10cnVlO3RoaXMucHJ2S2V5SGV4PWl9O3RoaXMuc2V0UHVibGljS2V5SGV4PWZ1bmN0aW9uKGkpe3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnB1YktleUhleD1pfTt0aGlzLmdlbmVyYXRlS2V5UGFpckhleD1mdW5jdGlvbigpe3ZhciBrPXRoaXMuZWNwYXJhbXMubjt2YXIgbj10aGlzLmdldEJpZ1JhbmRvbShrKTt2YXIgbD10aGlzLmVjcGFyYW1zLkcubXVsdGlwbHkobik7dmFyIHE9bC5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIG89bC5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGk9dGhpcy5lY3BhcmFtcy5rZXlsZW4vNDt2YXIgbT0oXCIwMDAwMDAwMDAwXCIrbi50b1N0cmluZygxNikpLnNsaWNlKC1pKTt2YXIgcj0oXCIwMDAwMDAwMDAwXCIrcS50b1N0cmluZygxNikpLnNsaWNlKC1pKTt2YXIgcD0oXCIwMDAwMDAwMDAwXCIrby50b1N0cmluZygxNikpLnNsaWNlKC1pKTt2YXIgaj1cIjA0XCIrcitwO3RoaXMuc2V0UHJpdmF0ZUtleUhleChtKTt0aGlzLnNldFB1YmxpY0tleUhleChqKTtyZXR1cm57ZWNwcnZoZXg6bSxlY3B1YmhleDpqfX07dGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnNpZ25IZXgoaSx0aGlzLnBydktleUhleCl9O3RoaXMuc2lnbkhleD1mdW5jdGlvbihvLGope3ZhciB0PW5ldyBCaWdJbnRlZ2VyKGosMTYpO3ZhciBsPXRoaXMuZWNwYXJhbXMubjt2YXIgcT1uZXcgQmlnSW50ZWdlcihvLDE2KTtkb3t2YXIgbT10aGlzLmdldEJpZ1JhbmRvbShsKTt2YXIgdT10aGlzLmVjcGFyYW1zLkc7dmFyIHA9dS5tdWx0aXBseShtKTt2YXIgaT1wLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2QobCl9d2hpbGUoaS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKTw9MCk7dmFyIHY9bS5tb2RJbnZlcnNlKGwpLm11bHRpcGx5KHEuYWRkKHQubXVsdGlwbHkoaSkpKS5tb2QobCk7cmV0dXJuIEtKVVIuY3J5cHRvLkVDRFNBLmJpUlNTaWdUb0FTTjFTaWcoaSx2KX07dGhpcy5zaWduPWZ1bmN0aW9uKG0sdSl7dmFyIHE9dTt2YXIgaj10aGlzLmVjcGFyYW1zLm47dmFyIHA9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobSk7ZG97dmFyIGw9dGhpcy5nZXRCaWdSYW5kb20oaik7dmFyIHQ9dGhpcy5lY3BhcmFtcy5HO3ZhciBvPXQubXVsdGlwbHkobCk7dmFyIGk9by5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGopfXdoaWxlKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk8PTApO3ZhciB2PWwubW9kSW52ZXJzZShqKS5tdWx0aXBseShwLmFkZChxLm11bHRpcGx5KGkpKSkubW9kKGopO3JldHVybiB0aGlzLnNlcmlhbGl6ZVNpZyhpLHYpfTt0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihqLGkpe3JldHVybiB0aGlzLnZlcmlmeUhleChqLGksdGhpcy5wdWJLZXlIZXgpfTt0aGlzLnZlcmlmeUhleD1mdW5jdGlvbihtLGkscCl7dmFyIGwsajt2YXIgbz1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleChpKTtsPW8ucjtqPW8uczt2YXIgaztrPUVDUG9pbnRGcC5kZWNvZGVGcm9tSGV4KHRoaXMuZWNwYXJhbXMuY3VydmUscCk7dmFyIG49bmV3IEJpZ0ludGVnZXIobSwxNik7cmV0dXJuIHRoaXMudmVyaWZ5UmF3KG4sbCxqLGspfTt0aGlzLnZlcmlmeT1mdW5jdGlvbihvLHAsail7dmFyIGwsaTtpZihCaXRjb2luLlV0aWwuaXNBcnJheShwKSl7dmFyIG49dGhpcy5wYXJzZVNpZyhwKTtsPW4ucjtpPW4uc31lbHNle2lmKFwib2JqZWN0XCI9PT10eXBlb2YgcCYmcC5yJiZwLnMpe2w9cC5yO2k9cC5zfWVsc2V7dGhyb3dcIkludmFsaWQgdmFsdWUgZm9yIHNpZ25hdHVyZVwifX12YXIgaztpZihqIGluc3RhbmNlb2YgRUNQb2ludEZwKXtrPWp9ZWxzZXtpZihCaXRjb2luLlV0aWwuaXNBcnJheShqKSl7az1FQ1BvaW50RnAuZGVjb2RlRnJvbSh0aGlzLmVjcGFyYW1zLmN1cnZlLGopfWVsc2V7dGhyb3dcIkludmFsaWQgZm9ybWF0IGZvciBwdWJrZXkgdmFsdWUsIG11c3QgYmUgYnl0ZSBhcnJheSBvciBFQ1BvaW50RnBcIn19dmFyIG09QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobyk7cmV0dXJuIHRoaXMudmVyaWZ5UmF3KG0sbCxpLGspfTt0aGlzLnZlcmlmeVJhdz1mdW5jdGlvbihvLGksdyxtKXt2YXIgbD10aGlzLmVjcGFyYW1zLm47dmFyIHU9dGhpcy5lY3BhcmFtcy5HO2lmKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxpLmNvbXBhcmVUbyhsKT49MCl7cmV0dXJuIGZhbHNlfWlmKHcuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHx3LmNvbXBhcmVUbyhsKT49MCl7cmV0dXJuIGZhbHNlfXZhciBwPXcubW9kSW52ZXJzZShsKTt2YXIgaz1vLm11bHRpcGx5KHApLm1vZChsKTt2YXIgaj1pLm11bHRpcGx5KHApLm1vZChsKTt2YXIgcT11Lm11bHRpcGx5KGspLmFkZChtLm11bHRpcGx5KGopKTt2YXIgdD1xLmdldFgoKS50b0JpZ0ludGVnZXIoKS5tb2QobCk7cmV0dXJuIHQuZXF1YWxzKGkpfTt0aGlzLnNlcmlhbGl6ZVNpZz1mdW5jdGlvbihrLGope3ZhciBsPWsudG9CeXRlQXJyYXlTaWduZWQoKTt2YXIgaT1qLnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIG09W107bS5wdXNoKDIpO20ucHVzaChsLmxlbmd0aCk7bT1tLmNvbmNhdChsKTttLnB1c2goMik7bS5wdXNoKGkubGVuZ3RoKTttPW0uY29uY2F0KGkpO20udW5zaGlmdChtLmxlbmd0aCk7bS51bnNoaWZ0KDQ4KTtyZXR1cm4gbX07dGhpcy5wYXJzZVNpZz1mdW5jdGlvbihuKXt2YXIgbTtpZihuWzBdIT00OCl7dGhyb3cgbmV3IEVycm9yKFwiU2lnbmF0dXJlIG5vdCBhIHZhbGlkIERFUlNlcXVlbmNlXCIpfW09MjtpZihuW21dIT0yKXt0aHJvdyBuZXcgRXJyb3IoXCJGaXJzdCBlbGVtZW50IGluIHNpZ25hdHVyZSBtdXN0IGJlIGEgREVSSW50ZWdlclwiKX12YXIgbD1uLnNsaWNlKG0rMixtKzIrblttKzFdKTttKz0yK25bbSsxXTtpZihuW21dIT0yKXt0aHJvdyBuZXcgRXJyb3IoXCJTZWNvbmQgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIGk9bi5zbGljZShtKzIsbSsyK25bbSsxXSk7bSs9MituW20rMV07dmFyIGs9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobCk7dmFyIGo9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQoaSk7cmV0dXJue3I6ayxzOmp9fTt0aGlzLnBhcnNlU2lnQ29tcGFjdD1mdW5jdGlvbihtKXtpZihtLmxlbmd0aCE9PTY1KXt0aHJvd1wiU2lnbmF0dXJlIGhhcyB0aGUgd3JvbmcgbGVuZ3RoXCJ9dmFyIGo9bVswXS0yNztpZihqPDB8fGo+Nyl7dGhyb3dcIkludmFsaWQgc2lnbmF0dXJlIHR5cGVcIn12YXIgbz10aGlzLmVjcGFyYW1zLm47dmFyIGw9QmlnSW50ZWdlci5mcm9tQnl0ZUFycmF5VW5zaWduZWQobS5zbGljZSgxLDMzKSkubW9kKG8pO3ZhciBrPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0uc2xpY2UoMzMsNjUpKS5tb2Qobyk7cmV0dXJue3I6bCxzOmssaTpqfX07aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5jdXJ2ZSE9PXVuZGVmaW5lZCl7dGhpcy5jdXJ2ZU5hbWU9aC5jdXJ2ZX19aWYodGhpcy5jdXJ2ZU5hbWU9PT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWV9dGhpcy5zZXROYW1lZEN1cnZlKHRoaXMuY3VydmVOYW1lKTtpZihoIT09dW5kZWZpbmVkKXtpZihoLnBydiE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQcml2YXRlS2V5SGV4KGgucHJ2KX1pZihoLnB1YiE9PXVuZGVmaW5lZCl7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaC5wdWIpfX19O0tKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4SW5IZXhSUyhhKTt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLnIsMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGIucywxNik7cmV0dXJue3I6ZCxzOmN9fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlM9ZnVuY3Rpb24oYyl7aWYoYy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wic2lnbmF0dXJlIGlzIG5vdCBhIEFTTi4xIHNlcXVlbmNlXCJ9dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooYywwKTtpZihiLmxlbmd0aCE9Mil7dGhyb3dcIm51bWJlciBvZiBzaWduYXR1cmUgQVNOLjEgc2VxdWVuY2UgZWxlbWVudHMgc2VlbSB3cm9uZ1wifXZhciBnPWJbMF07dmFyIGY9YlsxXTtpZihjLnN1YnN0cihnLDIpIT1cIjAyXCIpe3Rocm93XCIxc3QgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifWlmKGMuc3Vic3RyKGYsMikhPVwiMDJcIil7dGhyb3dcIjJuZCBpdGVtIG9mIHNlcXVlbmUgb2Ygc2lnbmF0dXJlIGlzIG5vdCBBU04uMSBpbnRlZ2VyXCJ9dmFyIGU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxnKTt2YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLGYpO3JldHVybntyOmUsczpkfX07S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnPWZ1bmN0aW9uKGMpe3ZhciBkPUtKVVIuY3J5cHRvLkVDRFNBLnBhcnNlU2lnSGV4SW5IZXhSUyhjKTt2YXIgYj1kLnI7dmFyIGE9ZC5zO2lmKGIuc3Vic3RyKDAsMik9PVwiMDBcIiYmKCgoYi5sZW5ndGgvMikqOCklKDE2KjgpKT09OCl7Yj1iLnN1YnN0cigyKX1pZihhLnN1YnN0cigwLDIpPT1cIjAwXCImJigoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSk9PTgpe2E9YS5zdWJzdHIoMil9aWYoKCgoYi5sZW5ndGgvMikqOCklKDE2KjgpKSE9MCl7dGhyb3dcInVua25vd24gRUNEU0Egc2lnIHIgbGVuZ3RoIGVycm9yXCJ9aWYoKCgoYS5sZW5ndGgvMikqOCklKDE2KjgpKSE9MCl7dGhyb3dcInVua25vd24gRUNEU0Egc2lnIHMgbGVuZ3RoIGVycm9yXCJ9cmV0dXJuIGIrYX07S0pVUi5jcnlwdG8uRUNEU0EuY29uY2F0U2lnVG9BU04xU2lnPWZ1bmN0aW9uKGEpe2lmKCgoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIGNvbmNhdGluYXRlZCByLXMgc2lnICBsZW5ndGggZXJyb3JcIn12YXIgYz1hLnN1YnN0cigwLGEubGVuZ3RoLzIpO3ZhciBiPWEuc3Vic3RyKGEubGVuZ3RoLzIpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5oZXhSU1NpZ1RvQVNOMVNpZyhjLGIpfTtLSlVSLmNyeXB0by5FQ0RTQS5oZXhSU1NpZ1RvQVNOMVNpZz1mdW5jdGlvbihiLGEpe3ZhciBkPW5ldyBCaWdJbnRlZ2VyKGIsMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGEsMTYpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnKGQsYyl9O0tKVVIuY3J5cHRvLkVDRFNBLmJpUlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oZSxjKXt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplfSk7dmFyIGE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Y30pO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltiLGFdfSk7cmV0dXJuIGQuZ2V0RW5jb2RlZEhleCgpfTtcbi8qISBlY3BhcmFtLTEuMC4wLmpzIChjKSAyMDEzIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQj1uZXcgZnVuY3Rpb24oKXt2YXIgYj17fTt2YXIgYz17fTtmdW5jdGlvbiBhKGQpe3JldHVybiBuZXcgQmlnSW50ZWdlcihkLDE2KX10aGlzLmdldEJ5TmFtZT1mdW5jdGlvbihlKXt2YXIgZD1lO2lmKHR5cGVvZiBjW2RdIT1cInVuZGVmaW5lZFwiKXtkPWNbZV19aWYodHlwZW9mIGJbZF0hPVwidW5kZWZpbmVkXCIpe3JldHVybiBiW2RdfXRocm93XCJ1bnJlZ2lzdGVyZWQgRUMgY3VydmUgbmFtZTogXCIrZH07dGhpcy5yZWdpc3Q9ZnVuY3Rpb24oQSxsLG8sZyxtLGUsaixmLGssdSxkLHgpe2JbQV09e307dmFyIHM9YShvKTt2YXIgej1hKGcpO3ZhciB5PWEobSk7dmFyIHQ9YShlKTt2YXIgdz1hKGopO3ZhciByPW5ldyBFQ0N1cnZlRnAocyx6LHkpO3ZhciBxPXIuZGVjb2RlUG9pbnRIZXgoXCIwNFwiK2Yrayk7YltBXVtcIm5hbWVcIl09QTtiW0FdW1wia2V5bGVuXCJdPWw7YltBXVtcImN1cnZlXCJdPXI7YltBXVtcIkdcIl09cTtiW0FdW1wiblwiXT10O2JbQV1bXCJoXCJdPXc7YltBXVtcIm9pZFwiXT1kO2JbQV1bXCJpbmZvXCJdPXg7Zm9yKHZhciB2PTA7djx1Lmxlbmd0aDt2Kyspe2NbdVt2XV09QX19fTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxMjhyMVwiLDEyOCxcIkZGRkZGRkZERkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiRTg3NTc5QzExMDc5RjQzREQ4MjQ5OTNDMkNFRTVFRDNcIixcIkZGRkZGRkZFMDAwMDAwMDA3NUEzMEQxQjkwMzhBMTE1XCIsXCIxXCIsXCIxNjFGRjc1MjhCODk5QjJEMEMyODYwN0NBNTJDNUI4NlwiLFwiQ0Y1QUM4Mzk1QkFGRUIxM0MwMkRBMjkyRERFRDdBODNcIixbXSxcIlwiLFwic2VjcDEyOHIxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTI4IGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxNjBrMVwiLDE2MCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkFDNzNcIixcIjBcIixcIjdcIixcIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFCOEZBMTZERkFCOUFDQTE2QjZCM1wiLFwiMVwiLFwiM0I0QzM4MkNFMzdBQTE5MkE0MDE5RTc2MzAzNkY0RjVERDREN0VCQlwiLFwiOTM4Q0Y5MzUzMThGRENFRDZCQzI4Mjg2NTMxNzMzQzNGMDNDNEZFRVwiLFtdLFwiXCIsXCJzZWNwMTYwazEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxNjAgYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE2MHIxXCIsMTYwLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY3RkZGRkZGQ1wiLFwiMUM5N0JFRkM1NEJEN0E4QjY1QUNGODlGODFENEQ0QURDNTY1RkE0NVwiLFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUY0QzhGOTI3QUVEM0NBNzUyMjU3XCIsXCIxXCIsXCI0QTk2QjU2ODhFRjU3MzI4NDY2NDY5ODk2OEMzOEJCOTEzQ0JGQzgyXCIsXCIyM0E2Mjg1NTMxNjg5NDdENTlEQ0M5MTIwNDIzNTEzNzdBQzVGQjMyXCIsW10sXCJcIixcInNlY3AxNjByMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTkyazFcIiwxOTIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkVFMzdcIixcIjBcIixcIjNcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRTI2RjJGQzE3MEY2OTQ2NkE3NERFRkQ4RFwiLFwiMVwiLFwiREI0RkYxMEVDMDU3RTlBRTI2QjA3RDAyODBCN0Y0MzQxREE1RDFCMUVBRTA2QzdEXCIsXCI5QjJGMkY2RDlDNTYyOEE3ODQ0MTYzRDAxNUJFODYzNDQwODJBQTg4RDk1RTJGOURcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTkycjFcIiwxOTIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGQ1wiLFwiNjQyMTA1MTlFNTlDODBFNzBGQTdFOUFCNzIyNDMwNDlGRUI4REVFQ0MxNDZCOUIxXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY5OURFRjgzNjE0NkJDOUIxQjREMjI4MzFcIixcIjFcIixcIjE4OERBODBFQjAzMDkwRjY3Q0JGMjBFQjQzQTE4ODAwRjRGRjBBRkQ4MkZGMTAxMlwiLFwiMDcxOTJCOTVGRkM4REE3ODYzMTAxMUVENkIyNENERDU3M0Y5NzdBMTFFNzk0ODExXCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDIyNHIxXCIsMjI0LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFXCIsXCJCNDA1MEE4NTBDMDRCM0FCRjU0MTMyNTY1MDQ0QjBCN0Q3QkZEOEJBMjcwQjM5NDMyMzU1RkZCNFwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjE2QTJFMEI4RjAzRTEzREQyOTQ1NUM1QzJBM0RcIixcIjFcIixcIkI3MEUwQ0JENkJCNEJGN0YzMjEzOTBCOTRBMDNDMUQzNTZDMjExMjIzNDMyODBENjExNUMxRDIxXCIsXCJCRDM3NjM4OEI1RjcyM0ZCNEMyMkRGRTZDRDQzNzVBMDVBMDc0NzY0NDRENTgxOTk4NTAwN0UzNFwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyNTZrMVwiLDI1NixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZDMkZcIixcIjBcIixcIjdcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQkFBRURDRTZBRjQ4QTAzQkJGRDI1RThDRDAzNjQxNDFcIixcIjFcIixcIjc5QkU2NjdFRjlEQ0JCQUM1NUEwNjI5NUNFODcwQjA3MDI5QkZDREIyRENFMjhEOTU5RjI4MTVCMTZGODE3OThcIixcIjQ4M0FEQTc3MjZBM0M0NjU1REE0RkJGQzBFMTEwOEE4RkQxN0I0NDhBNjg1NTQxOTlDNDdEMDhGRkIxMEQ0QjhcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjU2cjFcIiwyNTYsXCJGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGRjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZDXCIsXCI1QUM2MzVEOEFBM0E5M0U3QjNFQkJENTU3Njk4ODZCQzY1MUQwNkIwQ0M1M0IwRjYzQkNFM0MzRTI3RDI2MDRCXCIsXCJGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkJDRTZGQUFEQTcxNzlFODRGM0I5Q0FDMkZDNjMyNTUxXCIsXCIxXCIsXCI2QjE3RDFGMkUxMkM0MjQ3RjhCQ0U2RTU2M0E0NDBGMjc3MDM3RDgxMkRFQjMzQTBGNEExMzk0NUQ4OThDMjk2XCIsXCI0RkUzNDJFMkZFMUE3RjlCOEVFN0VCNEE3QzBGOUUxNjJCQ0UzMzU3NkIzMTVFQ0VDQkI2NDA2ODM3QkY1MUY1XCIsW1wiTklTVCBQLTI1NlwiLFwiUC0yNTZcIixcInByaW1lMjU2djFcIl0pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDM4NHIxXCIsMzg0LFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkNcIixcIkIzMzEyRkE3RTIzRUU3RTQ5ODhFMDU2QkUzRjgyRDE5MTgxRDlDNkVGRTgxNDExMjAzMTQwODhGNTAxMzg3NUFDNjU2Mzk4RDhBMkVEMTlEMkE4NUM4RUREM0VDMkFFRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQzc2MzREODFGNDM3MkRERjU4MUEwREIyNDhCMEE3N0FFQ0VDMTk2QUNDQzUyOTczXCIsXCIxXCIsXCJBQTg3Q0EyMkJFOEIwNTM3OEVCMUM3MUVGMzIwQUQ3NDZFMUQzQjYyOEJBNzlCOTg1OUY3NDFFMDgyNTQyQTM4NTUwMkYyNURCRjU1Mjk2QzNBNTQ1RTM4NzI3NjBBQjdcIixcIjM2MTdkZTRhOTYyNjJjNmY1ZDllOThiZjkyOTJkYzI5ZjhmNDFkYmQyODlhMTQ3Y2U5ZGEzMTEzYjVmMGI4YzAwYTYwYjFjZTFkN2U4MTlkN2E0MzFkN2M5MGVhMGU1ZlwiLFtcIk5JU1QgUC0zODRcIixcIlAtMzg0XCJdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3A1MjFyMVwiLDUyMSxcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGXCIsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiMDUxOTUzRUI5NjE4RTFDOUExRjkyOUEyMUEwQjY4NTQwRUVBMkRBNzI1Qjk5QjMxNUYzQjhCNDg5OTE4RUYxMDlFMTU2MTkzOTUxRUM3RTkzN0IxNjUyQzBCRDNCQjFCRjA3MzU3M0RGODgzRDJDMzRGMUVGNDUxRkQ0NkI1MDNGMDBcIixcIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkE1MTg2ODc4M0JGMkY5NjZCN0ZDQzAxNDhGNzA5QTVEMDNCQjVDOUI4ODk5QzQ3QUVCQjZGQjcxRTkxMzg2NDA5XCIsXCIxXCIsXCJDNjg1OEUwNkI3MDQwNEU5Q0Q5RTNFQ0I2NjIzOTVCNDQyOUM2NDgxMzkwNTNGQjUyMUY4MjhBRjYwNkI0RDNEQkFBMTRCNUU3N0VGRTc1OTI4RkUxREMxMjdBMkZGQThERTMzNDhCM0MxODU2QTQyOUJGOTdFN0UzMUMyRTVCRDY2XCIsXCIwMTE4MzkyOTZhNzg5YTNiYzAwNDVjOGE1ZmI0MmM3ZDFiZDk5OGY1NDQ0OTU3OWI0NDY4MTdhZmJkMTcyNzNlNjYyYzk3ZWU3Mjk5NWVmNDI2NDBjNTUwYjkwMTNmYWQwNzYxMzUzYzcwODZhMjcyYzI0MDg4YmU5NDc2OWZkMTY2NTBcIixbXCJOSVNUIFAtNTIxXCIsXCJQLTUyMVwiXSk7XG4vKiEgZHNhLW1vZGlmaWVkLTEuMC4xLmpzIChjKSBSZWN1cml0eSBMYWJzIEdtYkgsIEtlbmppIFVydXNoaW1tYSB8IGdpdGh1Yi5jb20vb3BlbnBncGpzL29wZW5wZ3Bqcy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5jcnlwdG89PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmNyeXB0byl7S0pVUi5jcnlwdG89e319S0pVUi5jcnlwdG8uRFNBPWZ1bmN0aW9uKCl7dGhpcy5wPW51bGw7dGhpcy5xPW51bGw7dGhpcy5nPW51bGw7dGhpcy55PW51bGw7dGhpcy54PW51bGw7dGhpcy50eXBlPVwiRFNBXCI7dGhpcy5zZXRQcml2YXRlPWZ1bmN0aW9uKHosdyx2LEEsdSl7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnA9ejt0aGlzLnE9dzt0aGlzLmc9djt0aGlzLnk9QTt0aGlzLng9dX07dGhpcy5zZXRQdWJsaWM9ZnVuY3Rpb24odyx2LHUseil7dGhpcy5pc1B1YmxpYz10cnVlO3RoaXMucD13O3RoaXMucT12O3RoaXMuZz11O3RoaXMueT16O3RoaXMueD1udWxsfTt0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oeil7dmFyIHY9dGhpcy5wO3ZhciB1PXRoaXMucTt2YXIgQz10aGlzLmc7dmFyIEQ9dGhpcy55O3ZhciBFPXRoaXMueDt2YXIgQT16LnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEI9bmV3IEJpZ0ludGVnZXIoeiwxNik7dmFyIHc9bihCaWdJbnRlZ2VyLk9ORS5hZGQoQmlnSW50ZWdlci5PTkUpLHUuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKTt2YXIgRz0oQy5tb2RQb3codyx2KSkubW9kKHUpO3ZhciBGPSh3Lm1vZEludmVyc2UodSkubXVsdGlwbHkoQi5hZGQoRS5tdWx0aXBseShHKSkpKS5tb2QodSk7dmFyIEg9S0pVUi5hc24xLkFTTjFVdGlsLmpzb25Ub0FTTjFIRVgoe3NlcTpbe1wiaW50XCI6e2JpZ2ludDpHfX0se1wiaW50XCI6e2JpZ2ludDpGfX1dfSk7cmV0dXJuIEh9O3RoaXMudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKEMsQil7dmFyIHo9dGhpcy5wO3ZhciB1PXRoaXMucTt2YXIgRz10aGlzLmc7dmFyIEg9dGhpcy55O3ZhciBFPXRoaXMucGFyc2VBU04xU2lnbmF0dXJlKEIpO3ZhciBLPUVbMF07dmFyIEo9RVsxXTt2YXIgQz1DLnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEQ9bmV3IEJpZ0ludGVnZXIoQywxNik7aWYoQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhLKT4wfHxLLmNvbXBhcmVUbyh1KT4wfHxCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKEopPjB8fEouY29tcGFyZVRvKHUpPjApe3Rocm93XCJpbnZhbGlkIERTQSBzaWduYXR1cmVcIn12YXIgST1KLm1vZEludmVyc2UodSk7dmFyIEE9RC5tdWx0aXBseShJKS5tb2QodSk7dmFyIHY9Sy5tdWx0aXBseShJKS5tb2QodSk7dmFyIEY9Ry5tb2RQb3coQSx6KS5tdWx0aXBseShILm1vZFBvdyh2LHopKS5tb2QoeikubW9kKHUpO3JldHVybiBGLmNvbXBhcmVUbyhLKT09MH07dGhpcy5wYXJzZUFTTjFTaWduYXR1cmU9ZnVuY3Rpb24odSl7dHJ5e3ZhciB5PW5ldyBCaWdJbnRlZ2VyKEFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzBdLFwiMDJcIiksMTYpO3ZhciB2PW5ldyBCaWdJbnRlZ2VyKEFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDJcIiksMTYpO3JldHVyblt5LHZdfWNhdGNoKHcpe3Rocm93XCJtYWxmb3JtZWQgRFNBIHNpZ25hdHVyZVwifX07ZnVuY3Rpb24gZChFLHcsQix2LHUsQyl7dmFyIHo9S0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKHcsRS50b0xvd2VyQ2FzZSgpKTt2YXIgej16LnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEE9bmV3IEJpZ0ludGVnZXIoeiwxNik7dmFyIHk9bihCaWdJbnRlZ2VyLk9ORS5hZGQoQmlnSW50ZWdlci5PTkUpLHUuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpKTt2YXIgRj0oQi5tb2RQb3coeSx2KSkubW9kKHUpO3ZhciBEPSh5Lm1vZEludmVyc2UodSkubXVsdGlwbHkoQS5hZGQoQy5tdWx0aXBseShGKSkpKS5tb2QodSk7dmFyIEc9bmV3IEFycmF5KCk7R1swXT1GO0dbMV09RDtyZXR1cm4gR31mdW5jdGlvbiByKHYpe3ZhciB1PW9wZW5wZ3AuY29uZmlnLmNvbmZpZy5wcmVmZXJfaGFzaF9hbGdvcml0aG07c3dpdGNoKE1hdGgucm91bmQodi5iaXRMZW5ndGgoKS84KSl7Y2FzZSAyMDppZih1IT0yJiZ1PjExJiZ1IT0xMCYmdTw4KXtyZXR1cm4gMn1yZXR1cm4gdTtjYXNlIDI4OmlmKHU+MTEmJnU8OCl7cmV0dXJuIDExfXJldHVybiB1O2Nhc2UgMzI6aWYodT4xMCYmdTw4KXtyZXR1cm4gOH1yZXR1cm4gdTtkZWZhdWx0OnV0aWwucHJpbnRfZGVidWcoXCJEU0Egc2VsZWN0IGhhc2ggYWxnb3JpdGhtOiByZXR1cm5pbmcgbnVsbCBmb3IgYW4gdW5rbm93biBsZW5ndGggb2YgcVwiKTtyZXR1cm4gbnVsbH19dGhpcy5zZWxlY3RfaGFzaF9hbGdvcml0aG09cjtmdW5jdGlvbiBtKEksSyxKLEIseix1LEYsRyl7dmFyIEM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKEIsSS50b0xvd2VyQ2FzZSgpKTt2YXIgQz1DLnN1YnN0cigwLHUuYml0TGVuZ3RoKCkvNCk7dmFyIEQ9bmV3IEJpZ0ludGVnZXIoQywxNik7aWYoQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhLKT4wfHxLLmNvbXBhcmVUbyh1KT4wfHxCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKEopPjB8fEouY29tcGFyZVRvKHUpPjApe3V0aWwucHJpbnRfZXJyb3IoXCJpbnZhbGlkIERTQSBTaWduYXR1cmVcIik7cmV0dXJuIG51bGx9dmFyIEg9Si5tb2RJbnZlcnNlKHUpO3ZhciBBPUQubXVsdGlwbHkoSCkubW9kKHUpO3ZhciB2PUsubXVsdGlwbHkoSCkubW9kKHUpO3ZhciBFPUYubW9kUG93KEEseikubXVsdGlwbHkoRy5tb2RQb3codix6KSkubW9kKHopLm1vZCh1KTtyZXR1cm4gRS5jb21wYXJlVG8oSyk9PTB9ZnVuY3Rpb24gYSh6KXt2YXIgQT1uZXcgQmlnSW50ZWdlcih6LHByaW1lQ2VudGVyaWUpO3ZhciB5PWoocSw1MTIpO3ZhciB1PXQocCxxLHopO3ZhciB2O2Rve3Y9bmV3IEJpZ0ludGVnZXIocS5iaXRDb3VudCgpLHJhbmQpfXdoaWxlKHguY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykhPTEmJnguY29tcGFyZVRvKHEpIT0tMSk7dmFyIHc9Zy5tb2RQb3coeCxwKTtyZXR1cm57eDp2LHE6QSxwOnksZzp1LHk6d319ZnVuY3Rpb24gaih5LHosdyl7aWYoeiU2NCE9MCl7cmV0dXJuIGZhbHNlfXZhciB1O3ZhciB2O2Rve3U9dyhiaXRjb3VudCx0cnVlKTt2PXUuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3U9dS5zdWJ0cmFjdCh2LnJlbWFpbmRlcih5KSl9d2hpbGUoIXUuaXNQcm9iYWJsZVByaW1lKHByaW1lQ2VudGVyaWUpfHx1LmJpdExlbmd0aCgpIT1sKTtyZXR1cm4gdX1mdW5jdGlvbiB0KEIseixBLHcpe3ZhciB1PUIuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO3ZhciB5PXUuZGl2aWRlKHopO3ZhciB2O2Rve3Y9dyhBKX13aGlsZSh2LmNvbXBhcmVUbyh1KSE9LTEmJnYuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MSk7cmV0dXJuIHYubW9kUG93KHksQil9ZnVuY3Rpb24gbyh3LHksdSl7dmFyIHY7ZG97dj11KHksZmFsc2UpfXdoaWxlKHYuY29tcGFyZVRvKHcpIT0tMSYmdi5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSE9MSk7cmV0dXJuIHZ9ZnVuY3Rpb24gaSh2LHcpe2s9byh2KTt2YXIgdT1nLm1vZFBvdyhrLHcpLm1vZCh2KTtyZXR1cm4gdX1mdW5jdGlvbiBoKEIsdyx5LHYseix1KXt2YXIgQT1CKHYpO3M9KHcubW9kSW52ZXJzZSh6KS5tdWx0aXBseShBLmFkZCh1Lm11bHRpcGx5KHkpKSkpLm1vZCh6KTtyZXR1cm4gc310aGlzLnNpZ249ZDt0aGlzLnZlcmlmeT1tO2Z1bmN0aW9uIG4odyx1KXtpZih1LmNvbXBhcmVUbyh3KTw9MCl7cmV0dXJufXZhciB2PXUuc3VidHJhY3Qodyk7dmFyIHk9ZSh2LmJpdExlbmd0aCgpKTt3aGlsZSh5PnYpe3k9ZSh2LmJpdExlbmd0aCgpKX1yZXR1cm4gdy5hZGQoeSl9ZnVuY3Rpb24gZSh3KXtpZih3PDApe3JldHVybiBudWxsfXZhciB1PU1hdGguZmxvb3IoKHcrNykvOCk7dmFyIHY9Yyh1KTtpZih3JTg+MCl7dj1TdHJpbmcuZnJvbUNoYXJDb2RlKChNYXRoLnBvdygyLHclOCktMSkmdi5jaGFyQ29kZUF0KDApKSt2LnN1YnN0cmluZygxKX1yZXR1cm4gbmV3IEJpZ0ludGVnZXIoZih2KSwxNil9ZnVuY3Rpb24gYyh3KXt2YXIgdT1cIlwiO2Zvcih2YXIgdj0wO3Y8dzt2Kyspe3UrPVN0cmluZy5mcm9tQ2hhckNvZGUoYigpKX1yZXR1cm4gdX1mdW5jdGlvbiBiKCl7dmFyIHU9bmV3IFVpbnQzMkFycmF5KDEpO3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHUpO3JldHVybiB1WzBdJjI1NX1mdW5jdGlvbiBmKHkpe2lmKHk9PW51bGwpe3JldHVyblwiXCJ9dmFyIHY9W107dmFyIHc9eS5sZW5ndGg7dmFyIHo9MDt2YXIgdTt3aGlsZSh6PHcpe3U9eVt6KytdLmNoYXJDb2RlQXQoKS50b1N0cmluZygxNik7d2hpbGUodS5sZW5ndGg8Mil7dT1cIjBcIit1fXYucHVzaChcIlwiK3UpfXJldHVybiB2LmpvaW4oXCJcIil9dGhpcy5nZXRSYW5kb21CaWdJbnRlZ2VySW5SYW5nZT1uO3RoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlcj1lO3RoaXMuZ2V0UmFuZG9tQnl0ZXM9Y307XG4vKiEgcGtjczVwa2V5LTEuMC42LmpzIChjKSAyMDEzLTIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIFBLQ1M1UEtFWT1mdW5jdGlvbigpe3ZhciBjPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gaShDcnlwdG9KUy5BRVMsbixwLG8pfTt2YXIgZD1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGkoQ3J5cHRvSlMuVHJpcGxlREVTLG4scCxvKX07dmFyIGk9ZnVuY3Rpb24ocSx2LHMsbyl7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh2KTt2YXIgdT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMpO3ZhciBuPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobyk7dmFyIHI9e307ci5rZXk9dTtyLml2PW47ci5jaXBoZXJ0ZXh0PXA7dmFyIHQ9cS5kZWNyeXB0KHIsdSx7aXY6bn0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh0KX07dmFyIGo9ZnVuY3Rpb24obixwLG8pe3JldHVybiBlKENyeXB0b0pTLkFFUyxuLHAsbyl9O3ZhciBtPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gZShDcnlwdG9KUy5UcmlwbGVERVMsbixwLG8pfTt2YXIgZT1mdW5jdGlvbihzLHgsdixwKXt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHgpO3ZhciB3PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShwKTt2YXIgbj17fTt2YXIgdT1zLmVuY3J5cHQocix3LHtpdjpvfSk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1LnRvU3RyaW5nKCkpO3ZhciB0PUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHEpO3JldHVybiB0fTt2YXIgZz17XCJBRVMtMjU2LUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MzIsaXZsZW46MTZ9LFwiQUVTLTE5Mi1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjI0LGl2bGVuOjE2fSxcIkFFUy0xMjgtQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjoxNixpdmxlbjoxNn0sXCJERVMtRURFMy1DQkNcIjp7cHJvYzpkLGVwcm9jOm0sa2V5bGVuOjI0LGl2bGVuOjh9fTt2YXIgYj1mdW5jdGlvbihuKXtyZXR1cm4gZ1tuXVtcInByb2NcIl19O3ZhciBrPWZ1bmN0aW9uKG4pe3ZhciBwPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKG4pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHApO3JldHVybiBvfTt2YXIgbD1mdW5jdGlvbihxKXt2YXIgcj17fTtpZihxLm1hdGNoKG5ldyBSZWdFeHAoXCJERUstSW5mbzogKFteLF0rKSwoWzAtOUEtRmEtZl0rKVwiLFwibVwiKSkpe3IuY2lwaGVyPVJlZ0V4cC4kMTtyLml2c2FsdD1SZWdFeHAuJDJ9aWYocS5tYXRjaChuZXcgUmVnRXhwKFwiLS0tLS1CRUdJTiAoW0EtWl0rKSBQUklWQVRFIEtFWS0tLS0tXCIpKSl7ci50eXBlPVJlZ0V4cC4kMX12YXIgcD0tMTt2YXIgdD0wO2lmKHEuaW5kZXhPZihcIlxcclxcblxcclxcblwiKSE9LTEpe3A9cS5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpO3Q9Mn1pZihxLmluZGV4T2YoXCJcXG5cXG5cIikhPS0xKXtwPXEuaW5kZXhPZihcIlxcblxcblwiKTt0PTF9dmFyIG89cS5pbmRleE9mKFwiLS0tLS1FTkRcIik7aWYocCE9LTEmJm8hPS0xKXt2YXIgbj1xLnN1YnN0cmluZyhwK3QqMixvLXQpO249bi5yZXBsYWNlKC9cXHMrL2csXCJcIik7ci5kYXRhPW59cmV0dXJuIHJ9O3ZhciBoPWZ1bmN0aW9uKG8sdyxuKXt2YXIgdD1uLnN1YnN0cmluZygwLDE2KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHQpO3ZhciBwPUNyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHcpO3ZhciBzPWdbb11bXCJrZXlsZW5cIl0rZ1tvXVtcIml2bGVuXCJdO3ZhciB2PVwiXCI7dmFyIHU9bnVsbDtmb3IoOzspe3ZhciBxPUNyeXB0b0pTLmFsZ28uTUQ1LmNyZWF0ZSgpO2lmKHUhPW51bGwpe3EudXBkYXRlKHUpfXEudXBkYXRlKHApO3EudXBkYXRlKHIpO3U9cS5maW5hbGl6ZSgpO3Y9ditDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh1KTtpZih2Lmxlbmd0aD49cyoyKXticmVha319dmFyIHg9e307eC5rZXloZXg9di5zdWJzdHIoMCxnW29dW1wia2V5bGVuXCJdKjIpO3guaXZoZXg9di5zdWJzdHIoZ1tvXVtcImtleWxlblwiXSoyLGdbb11bXCJpdmxlblwiXSoyKTtyZXR1cm4geH07dmFyIGE9ZnVuY3Rpb24obix0LHAsdSl7dmFyIHE9Q3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShuKTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShxKTt2YXIgcz1nW3RdW1wicHJvY1wiXTt2YXIgcj1zKG8scCx1KTtyZXR1cm4gcn07dmFyIGY9ZnVuY3Rpb24obixxLG8scyl7dmFyIHA9Z1txXVtcImVwcm9jXCJdO3ZhciByPXAobixvLHMpO3JldHVybiByfTtyZXR1cm57dmVyc2lvbjpcIjEuMC41XCIsZ2V0SGV4RnJvbVBFTTpmdW5jdGlvbihvLHIpe3ZhciBwPW87aWYocC5pbmRleE9mKFwiQkVHSU4gXCIrcik9PS0xKXt0aHJvd1wiY2FuJ3QgZmluZCBQRU0gaGVhZGVyOiBcIityfXA9cC5yZXBsYWNlKFwiLS0tLS1CRUdJTiBcIityK1wiLS0tLS1cIixcIlwiKTtwPXAucmVwbGFjZShcIi0tLS0tRU5EIFwiK3IrXCItLS0tLVwiLFwiXCIpO3ZhciBxPXAucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBuPWI2NHRvaGV4KHEpO3JldHVybiBufSxnZXREZWNyeXB0ZWRLZXlIZXhCeUtleUlWOmZ1bmN0aW9uKG8scixxLHApe3ZhciBuPWIocik7cmV0dXJuIG4obyxxLHApfSxwYXJzZVBLQ1M1UEVNOmZ1bmN0aW9uKG4pe3JldHVybiBsKG4pfSxnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQ6ZnVuY3Rpb24obyxuLHApe3JldHVybiBoKG8sbixwKX0sZGVjcnlwdEtleUI2NDpmdW5jdGlvbihuLHAsbyxxKXtyZXR1cm4gYShuLHAsbyxxKX0sZ2V0RGVjcnlwdGVkS2V5SGV4OmZ1bmN0aW9uKHcsdil7dmFyIG89bCh3KTt2YXIgcj1vLnR5cGU7dmFyIHA9by5jaXBoZXI7dmFyIG49by5pdnNhbHQ7dmFyIHE9by5kYXRhO3ZhciB1PWgocCx2LG4pO3ZhciB0PXUua2V5aGV4O3ZhciBzPWEocSxwLHQsbik7cmV0dXJuIHN9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihwLG8pe3ZhciBxPXRoaXMuZ2V0RGVjcnlwdGVkS2V5SGV4KHAsbyk7dmFyIG49bmV3IFJTQUtleSgpO24ucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhxKTtyZXR1cm4gbn0sZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleDpmdW5jdGlvbihxLHgscixwKXt2YXIgbj1cIlwiO2lmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXtyPVwiQUVTLTI1Ni1DQkNcIn1pZih0eXBlb2YgZ1tyXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIlBLQ1M1UEtFWSB1bnN1cHBvcnRlZCBhbGdvcml0aG06IFwiK3J9aWYodHlwZW9mIHA9PVwidW5kZWZpbmVkXCJ8fHA9PW51bGwpe3ZhciB0PWdbcl1bXCJpdmxlblwiXTt2YXIgcz1rKHQpO3A9cy50b1VwcGVyQ2FzZSgpfXZhciB3PWgocix4LHApO3ZhciB2PXcua2V5aGV4O3ZhciB1PWYocSxyLHYscCk7dmFyIG89dS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTt2YXIgbj1cIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtuKz1cIlByb2MtVHlwZTogNCxFTkNSWVBURURcXHJcXG5cIjtuKz1cIkRFSy1JbmZvOiBcIityK1wiLFwiK3ArXCJcXHJcXG5cIjtuKz1cIlxcclxcblwiO24rPW87bis9XCJcXHJcXG4tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3JldHVybiBufSxnZXRFcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5OmZ1bmN0aW9uKEMsRCxvLHMpe3ZhciBBPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dmFyIHY9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6Qy5ufSk7dmFyIHo9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOkMuZX0pO3ZhciBCPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuZH0pO3ZhciB0PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMucH0pO3ZhciByPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMucX0pO3ZhciB5PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuZG1wMX0pO3ZhciB1PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuZG1xMX0pO3ZhciB4PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMuY29lZmZ9KTt2YXIgRT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbQSx2LHosQix0LHIseSx1LHhdfSk7dmFyIHc9RS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleCh3LEQsbyxzKX0sbmV3RW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24obixvLHIscyl7aWYodHlwZW9mIG89PVwidW5kZWZpbmVkXCJ8fG89PW51bGwpe289MTAyNH1pZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7cj1cIjEwMDAxXCJ9dmFyIHA9bmV3IFJTQUtleSgpO3AuZ2VuZXJhdGUobyxyKTt2YXIgcT1udWxsO2lmKHR5cGVvZiBzPT1cInVuZGVmaW5lZFwifHxzPT1udWxsKXtxPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHBrZXksbil9ZWxzZXtxPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHBrZXksbixzKX1yZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhQRU06ZnVuY3Rpb24ocCl7aWYocC5tYXRjaCgvRU5DUllQVEVELykpe3Rocm93XCJwZW0gc2hhbGwgYmUgbm90IEVOQ1JZUFRFRFwifXZhciBvPXRoaXMuZ2V0SGV4RnJvbVBFTShwLFwiUFJJVkFURSBLRVlcIik7dmFyIG49dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChvKTtyZXR1cm4gbn0sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXg6ZnVuY3Rpb24ocSl7dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSwwKTtpZihwLmxlbmd0aCE9Myl7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMyBlbGVtZW50czogXCIrcC5sZW5ndGh9dmFyIG89QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihxLHBbMV0pO2lmKG8hPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZGVudGlmaWVyIGlzIG5vdCByc2FFbmM6IFwiK299dmFyIG89QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihxLHBbMV0pO3ZhciByPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzJdKTt2YXIgcz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLDApO3ZhciBuPW5ldyBSU0FLZXkoKTtuLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocyk7cmV0dXJuIG59LHBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTODpmdW5jdGlvbih1KXt2YXIgcT17fTt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LDApO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMCkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9cS5jaXBoZXJ0ZXh0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUscFsxXSk7dmFyIHc9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxwWzBdKTtpZih3Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMCkuaXRlbXMgIT0gMjogXCIrdy5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx3WzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGRcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCRVMyXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSx3WzFdKTtpZih3Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xKS5pdGVtcyAhPSAyOiBcIituLmxlbmd0aH12YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LG5bMV0pO2lmKG8ubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMSkuaXRlbXMgIT0gMjogXCIrby5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxvWzBdKSE9XCIyYTg2NDg4NmY3MGQwMzA3XCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgVHJpcGxlREVTXCJ9cS5lbmNyeXB0aW9uU2NoZW1lQWxnPVwiVHJpcGxlREVTXCI7cS5lbmNyeXB0aW9uU2NoZW1lSVY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxvWzFdKTt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LG5bMF0pO2lmKHIubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMCkuaXRlbXMgIT0gMjogXCIrci5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSxyWzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGNcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCS0RGMlwifXZhciB2PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsclsxXSk7aWYodi5sZW5ndGg8Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjAuMSkuaXRlbXMgPCAyOiBcIit2Lmxlbmd0aH1xLnBia2RmMlNhbHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx2WzBdKTt2YXIgcz1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHZbMV0pO3RyeXtxLnBia2RmMkl0ZXI9cGFyc2VJbnQocywxNil9Y2F0Y2godCl7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQgcGJrZGYySXRlcjogXCIrc31yZXR1cm4gcX0sZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtOmZ1bmN0aW9uKHMsbil7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzLnBia2RmMlNhbHQpO3ZhciBvPXMucGJrZGYySXRlcjt2YXIgcT1DcnlwdG9KUy5QQktERjIobixyLHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOm99KTt2YXIgcD1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShxKTtyZXR1cm4gcH0sZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbih2LHcpe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTSh2LFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpO3ZhciBuPXRoaXMucGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4KHApO3ZhciBzPVBLQ1M1UEtFWS5nZXRQQktERjJLZXlIZXhGcm9tUGFyYW0obix3KTt2YXIgdD17fTt0LmNpcGhlcnRleHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShuLmNpcGhlcnRleHQpO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocyk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShuLmVuY3J5cHRpb25TY2hlbWVJVik7dmFyIHU9Q3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQodCxyLHtpdjpxfSk7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodSk7cmV0dXJuIG99LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihxLHApe3ZhciBvPXRoaXMuZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTShxLHApO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgobyk7cmV0dXJuIG59LGdldEtleUZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbihxLG8pe3ZhciBuPXRoaXMuZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTShxLG8pO3ZhciBwPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KG4pO3JldHVybiBwfSxwYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBvPXt9O28uYWxncGFyYW09bnVsbDtpZihxLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSwwKTtpZihwLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMilcIn1pZihxLnN1YnN0cihwWzFdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDMpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSxwWzFdKTtpZihuLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNClcIn1pZihxLnN1YnN0cihuWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDUpXCJ9by5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxuWzBdKTtpZihxLnN1YnN0cihuWzFdLDIpPT1cIjA2XCIpe28uYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxuWzFdKX1pZihxLnN1YnN0cihwWzJdLDIpIT1cIjA0XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDYpXCJ9by5rZXlpZHg9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihxLHBbMl0pO3JldHVybiBvfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU06ZnVuY3Rpb24obyl7dmFyIG49dGhpcy5nZXRIZXhGcm9tUEVNKG8sXCJQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChuKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4OmZ1bmN0aW9uKG4pe3ZhciBwPXRoaXMucGFyc2VQbGFpblByaXZhdGVQS0NTOEhleChuKTtpZihwLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iaihuLHApO3ZhciBvPXAua2V5O3ZhciBxPW5ldyBSU0FLZXkoKTtxLnNldFByaXZhdGVFeChvLm4sby5lLG8uZCxvLnAsby5xLG8uZHAsby5kcSxvLmNvKTtyZXR1cm4gcX1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iaihuLHApO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3AuYWxncGFyYW19dmFyIHI9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dO3ZhciBxPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cixwcnY6cC5rZXl9KTtyZXR1cm4gcX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwcml2YXRlIGtleSBhbGdvcml0aG1cIn19fSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhQRU06ZnVuY3Rpb24obyl7dmFyIHA9dGhpcy5nZXRIZXhGcm9tUEVNKG8sXCJQVUJMSUMgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4SGV4KHApO3JldHVybiBufSxnZXRLZXlGcm9tUHVibGljUEtDUzhQRU06ZnVuY3Rpb24obyl7dmFyIHA9dGhpcy5nZXRIZXhGcm9tUEVNKG8sXCJQVUJMSUMgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4KHApO3JldHVybiBufSxnZXRLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24obyl7dmFyIG49dGhpcy5wYXJzZVB1YmxpY1BLQ1M4SGV4KG8pO2lmKG4uYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt2YXIgcj10aGlzLnBhcnNlUHVibGljUmF3UlNBS2V5SGV4KG4ua2V5KTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5zZXRQdWJsaWMoci5uLHIuZSk7cmV0dXJuIHB9ZWxzZXtpZihuLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbbi5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIituLmFsZ3BhcmFtfXZhciBxPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtuLmFsZ3BhcmFtXTt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnEscHViOm4ua2V5fSk7cmV0dXJuIHB9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHVibGljIGtleSBhbGdvcml0aG1cIn19fSxwYXJzZVB1YmxpY1Jhd1JTQUtleUhleDpmdW5jdGlvbihwKXt2YXIgbj17fTtpZihwLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMSlcIn12YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihwLDApO2lmKG8ubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYocC5zdWJzdHIob1swXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9bi5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHAsb1swXSk7aWYocC5zdWJzdHIob1sxXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDQpXCJ9bi5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHAsb1sxXSk7cmV0dXJuIG59LHBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqOmZ1bmN0aW9uKG8scSl7dmFyIHA9cS5rZXlpZHg7aWYoby5zdWJzdHIocCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihvLHApO2lmKG4ubGVuZ3RoIT05KXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMilcIn1xLmtleT17fTtxLmtleS5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblsxXSk7cS5rZXkuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMl0pO3Eua2V5LmQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzNdKTtxLmtleS5wPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls0XSk7cS5rZXkucT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNV0pO3Eua2V5LmRwPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls2XSk7cS5rZXkuZHE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzddKTtxLmtleS5jbz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bOF0pfSxwYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqOmZ1bmN0aW9uKG8scSl7dmFyIHA9cS5rZXlpZHg7aWYoby5zdWJzdHIocCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihvLHApO2lmKG4ubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMilcIn1pZihvLnN1YnN0cihuWzFdLDIpIT1cIjA0XCIpe3Rocm93XCJtYWxmb3JtZWQgRUNDIHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXEua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblsxXSl9LHBhcnNlUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocSl7dmFyIG89e307by5hbGdwYXJhbT1udWxsO3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3AubGVuZ3RofXZhciByPXBbMF07aWYocS5zdWJzdHIociwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocSxyKTtpZihuLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAyKVwifWlmKHEuc3Vic3RyKG5bMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAzKVwifW8uYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblswXSk7aWYocS5zdWJzdHIoblsxXSwyKT09XCIwNlwiKXtvLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblsxXSl9aWYocS5zdWJzdHIocFsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9by5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzFdKS5zdWJzdHIoMik7cmV0dXJuIG99LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihyKXt2YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitxLmxlbmd0aH12YXIgcD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHIscVswXSk7aWYocCE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkIGlzIG5vdCByc2FFbmNyeXB0aW9uXCJ9aWYoci5zdWJzdHIocVsxXSwyKSE9XCIwM1wiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgQklUU1RSSU5HIGVuY2Fwc2xhdGVkLlwifXZhciB0PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocixxWzFdKSsyO2lmKHIuc3Vic3RyKHQsMikhPVwiMzBcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IFNFUVVFTkNFLlwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHIsdCk7aWYobi5sZW5ndGghPTIpe3Rocm93XCJpbm5lciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK24ubGVuZ3RofWlmKHIuc3Vic3RyKG5bMF0sMikhPVwiMDJcIil7dGhyb3dcIk4gaXMgbm90IEFTTi4xIElOVEVHRVJcIn1pZihyLnN1YnN0cihuWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJFIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixuWzBdKTt2YXIgcz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihyLG5bMV0pO3ZhciBvPW5ldyBSU0FLZXkoKTtvLnNldFB1YmxpYyh1LHMpO3JldHVybiBvfSx9fSgpO1xuLyohIGtleXV0aWwtMS4wLjEyLmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIEtFWVVUSUw9ZnVuY3Rpb24oKXt2YXIgZD1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuQUVTLHAscixxKX07dmFyIGU9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLlRyaXBsZURFUyxwLHIscSl9O3ZhciBhPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5ERVMscCxyLHEpfTt2YXIgaz1mdW5jdGlvbihzLHgsdSxxKXt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHgpO3ZhciB3PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodSk7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShxKTt2YXIgdD17fTt0LmtleT13O3QuaXY9cDt0LmNpcGhlcnRleHQ9cjt2YXIgdj1zLmRlY3J5cHQodCx3LHtpdjpwfSk7cmV0dXJuIENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHYpfTt2YXIgbD1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuQUVTLHAscixxKX07dmFyIG89ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLlRyaXBsZURFUyxwLHIscSl9O3ZhciBmPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5ERVMscCxyLHEpfTt2YXIgZz1mdW5jdGlvbih0LHksdixxKXt2YXIgcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHkpO3ZhciB4PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShxKTt2YXIgdz10LmVuY3J5cHQocyx4LHtpdjpwfSk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh3LnRvU3RyaW5nKCkpO3ZhciB1PUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHIpO3JldHVybiB1fTt2YXIgaT17XCJBRVMtMjU2LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MzIsaXZsZW46MTZ9LFwiQUVTLTE5Mi1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjI0LGl2bGVuOjE2fSxcIkFFUy0xMjgtQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoxNixpdmxlbjoxNn0sXCJERVMtRURFMy1DQkNcIjp7cHJvYzplLGVwcm9jOm8sa2V5bGVuOjI0LGl2bGVuOjh9LFwiREVTLUNCQ1wiOntwcm9jOmEsZXByb2M6ZixrZXlsZW46OCxpdmxlbjo4fX07dmFyIGM9ZnVuY3Rpb24ocCl7cmV0dXJuIGlbcF1bXCJwcm9jXCJdfTt2YXIgbT1mdW5jdGlvbihwKXt2YXIgcj1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShwKTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShyKTtyZXR1cm4gcX07dmFyIG49ZnVuY3Rpb24odCl7dmFyIHU9e307aWYodC5tYXRjaChuZXcgUmVnRXhwKFwiREVLLUluZm86IChbXixdKyksKFswLTlBLUZhLWZdKylcIixcIm1cIikpKXt1LmNpcGhlcj1SZWdFeHAuJDE7dS5pdnNhbHQ9UmVnRXhwLiQyfWlmKHQubWF0Y2gobmV3IFJlZ0V4cChcIi0tLS0tQkVHSU4gKFtBLVpdKykgUFJJVkFURSBLRVktLS0tLVwiKSkpe3UudHlwZT1SZWdFeHAuJDF9dmFyIHI9LTE7dmFyIHY9MDtpZih0LmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIikhPS0xKXtyPXQuaW5kZXhPZihcIlxcclxcblxcclxcblwiKTt2PTJ9aWYodC5pbmRleE9mKFwiXFxuXFxuXCIpIT0tMSl7cj10LmluZGV4T2YoXCJcXG5cXG5cIik7dj0xfXZhciBxPXQuaW5kZXhPZihcIi0tLS0tRU5EXCIpO2lmKHIhPS0xJiZxIT0tMSl7dmFyIHA9dC5zdWJzdHJpbmcocit2KjIscS12KTtwPXAucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3UuZGF0YT1wfXJldHVybiB1fTt2YXIgaj1mdW5jdGlvbihxLHkscCl7dmFyIHY9cC5zdWJzdHJpbmcoMCwxNik7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh2KTt2YXIgcj1DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh5KTt2YXIgdT1pW3FdW1wia2V5bGVuXCJdK2lbcV1bXCJpdmxlblwiXTt2YXIgeD1cIlwiO3ZhciB3PW51bGw7Zm9yKDs7KXt2YXIgcz1DcnlwdG9KUy5hbGdvLk1ENS5jcmVhdGUoKTtpZih3IT1udWxsKXtzLnVwZGF0ZSh3KX1zLnVwZGF0ZShyKTtzLnVwZGF0ZSh0KTt3PXMuZmluYWxpemUoKTt4PXgrQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodyk7aWYoeC5sZW5ndGg+PXUqMil7YnJlYWt9fXZhciB6PXt9O3oua2V5aGV4PXguc3Vic3RyKDAsaVtxXVtcImtleWxlblwiXSoyKTt6Lml2aGV4PXguc3Vic3RyKGlbcV1bXCJrZXlsZW5cIl0qMixpW3FdW1wiaXZsZW5cIl0qMik7cmV0dXJuIHp9O3ZhciBiPWZ1bmN0aW9uKHAsdixyLHcpe3ZhciBzPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7dmFyIHU9aVt2XVtcInByb2NcIl07dmFyIHQ9dShxLHIsdyk7cmV0dXJuIHR9O3ZhciBoPWZ1bmN0aW9uKHAscyxxLHUpe3ZhciByPWlbc11bXCJlcHJvY1wiXTt2YXIgdD1yKHAscSx1KTtyZXR1cm4gdH07cmV0dXJue3ZlcnNpb246XCIxLjAuMFwiLGdldEhleEZyb21QRU06ZnVuY3Rpb24ocSx1KXt2YXIgcj1xO2lmKHIuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrdX1pZih0eXBlb2YgdT09XCJzdHJpbmdcIiYmdSE9XCJcIil7cj1yLnJlcGxhY2UoXCItLS0tLUJFR0lOIFwiK3UrXCItLS0tLVwiLFwiXCIpO3I9ci5yZXBsYWNlKFwiLS0tLS1FTkQgXCIrdStcIi0tLS0tXCIsXCJcIil9ZWxzZXtyPXIucmVwbGFjZSgvLS0tLS1CRUdJTiBbXi1dKy0tLS0tLyxcIlwiKTtyPXIucmVwbGFjZSgvLS0tLS1FTkQgW14tXSstLS0tLS8sXCJcIil9dmFyIHQ9ci5yZXBsYWNlKC9cXHMrL2csXCJcIik7dmFyIHA9YjY0dG9oZXgodCk7cmV0dXJuIHB9LGdldERlY3J5cHRlZEtleUhleEJ5S2V5SVY6ZnVuY3Rpb24ocSx0LHMscil7dmFyIHA9Yyh0KTtyZXR1cm4gcChxLHMscil9LHBhcnNlUEtDUzVQRU06ZnVuY3Rpb24ocCl7cmV0dXJuIG4ocCl9LGdldEtleUFuZFVudXNlZEl2QnlQYXNzY29kZUFuZEl2c2FsdDpmdW5jdGlvbihxLHAscil7cmV0dXJuIGoocSxwLHIpfSxkZWNyeXB0S2V5QjY0OmZ1bmN0aW9uKHAscixxLHMpe3JldHVybiBiKHAscixxLHMpfSxnZXREZWNyeXB0ZWRLZXlIZXg6ZnVuY3Rpb24oeSx4KXt2YXIgcT1uKHkpO3ZhciB0PXEudHlwZTt2YXIgcj1xLmNpcGhlcjt2YXIgcD1xLml2c2FsdDt2YXIgcz1xLmRhdGE7dmFyIHc9aihyLHgscCk7dmFyIHY9dy5rZXloZXg7dmFyIHU9YihzLHIsdixwKTtyZXR1cm4gdX0sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHIscSl7dmFyIHM9dGhpcy5nZXREZWNyeXB0ZWRLZXlIZXgocixxKTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHMpO3JldHVybiBwfSxnZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24oeCxzLEEsdCxyKXt2YXIgcD1cIlwiO2lmKHR5cGVvZiB0PT1cInVuZGVmaW5lZFwifHx0PT1udWxsKXt0PVwiQUVTLTI1Ni1DQkNcIn1pZih0eXBlb2YgaVt0XT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIktFWVVUSUwgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIit0fWlmKHR5cGVvZiByPT1cInVuZGVmaW5lZFwifHxyPT1udWxsKXt2YXIgdj1pW3RdW1wiaXZsZW5cIl07dmFyIHU9bSh2KTtyPXUudG9VcHBlckNhc2UoKX12YXIgej1qKHQsQSxyKTt2YXIgeT16LmtleWhleDt2YXIgdz1oKHMsdCx5LHIpO3ZhciBxPXcucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIHA9XCItLS0tLUJFR0lOIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3ArPVwiUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxcclxcblwiO3ArPVwiREVLLUluZm86IFwiK3QrXCIsXCIrcitcIlxcclxcblwiO3ArPVwiXFxyXFxuXCI7cCs9cTtwKz1cIlxcclxcbi0tLS0tRU5EIFwiK3grXCIgUFJJVkFURSBLRVktLS0tLVxcclxcblwiO3JldHVybiBwfSxnZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21SU0FLZXk6ZnVuY3Rpb24oRCxFLHIsdCl7dmFyIEI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOjB9KTt2YXIgdz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpELm59KTt2YXIgQT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6RC5lfSk7dmFyIEM9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5kfSk7dmFyIHU9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5wfSk7dmFyIHM9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5xfSk7dmFyIHo9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5kbXAxfSk7dmFyIHY9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5kbXExfSk7dmFyIHk9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5jb2VmZn0pO3ZhciBGPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltCLHcsQSxDLHUscyx6LHYseV19KTt2YXIgeD1GLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJSU0FcIix4LEUscix0KX0sbmV3RW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocCxxLHQsdSl7aWYodHlwZW9mIHE9PVwidW5kZWZpbmVkXCJ8fHE9PW51bGwpe3E9MTAyNH1pZih0eXBlb2YgdD09XCJ1bmRlZmluZWRcInx8dD09bnVsbCl7dD1cIjEwMDAxXCJ9dmFyIHI9bmV3IFJTQUtleSgpO3IuZ2VuZXJhdGUocSx0KTt2YXIgcz1udWxsO2lmKHR5cGVvZiB1PT1cInVuZGVmaW5lZFwifHx1PT1udWxsKXtzPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHIscCl9ZWxzZXtzPXRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5KHIscCx1KX1yZXR1cm4gc30sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhQRU06ZnVuY3Rpb24ocil7aWYoci5tYXRjaCgvRU5DUllQVEVELykpe3Rocm93XCJwZW0gc2hhbGwgYmUgbm90IEVOQ1JZUFRFRFwifXZhciBxPXRoaXMuZ2V0SGV4RnJvbVBFTShyLFwiUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChxKTtyZXR1cm4gcH0sZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Myl7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMyBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHE9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihzLHJbMV0pO2lmKHEhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZGVudGlmaWVyIGlzIG5vdCByc2FFbmM6IFwiK3F9dmFyIHE9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihzLHJbMV0pO3ZhciB0PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzJdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LDApO3ZhciBwPW5ldyBSU0FLZXkoKTtwLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcodSk7cmV0dXJuIHB9LHBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTODpmdW5jdGlvbih3KXt2YXIgcz17fTt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LDApO2lmKHIubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMCkuaXRlbXMgIT0gMjogXCIrci5sZW5ndGh9cy5jaXBoZXJ0ZXh0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcsclsxXSk7dmFyIHk9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxyWzBdKTtpZih5Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMCkuaXRlbXMgIT0gMjogXCIreS5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx5WzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGRcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCRVMyXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyx5WzFdKTtpZih5Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xKS5pdGVtcyAhPSAyOiBcIitwLmxlbmd0aH12YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHBbMV0pO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMSkuaXRlbXMgIT0gMjogXCIrcS5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyxxWzBdKSE9XCIyYTg2NDg4NmY3MGQwMzA3XCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgVHJpcGxlREVTXCJ9cy5lbmNyeXB0aW9uU2NoZW1lQWxnPVwiVHJpcGxlREVTXCI7cy5lbmNyeXB0aW9uU2NoZW1lSVY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyxxWzFdKTt2YXIgdD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHBbMF0pO2lmKHQubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIGZvcm1hdDogU0VRVUVOQ0UoMC4wLjEuMCkuaXRlbXMgIT0gMjogXCIrdC5sZW5ndGh9aWYoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx0WzBdKSE9XCIyYTg2NDg4NmY3MGQwMTA1MGNcIil7dGhyb3dcInRoaXMgb25seSBzdXBwb3J0cyBwa2NzNVBCS0RGMlwifXZhciB4PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsdFsxXSk7aWYoeC5sZW5ndGg8Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjAuMSkuaXRlbXMgPCAyOiBcIit4Lmxlbmd0aH1zLnBia2RmMlNhbHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx4WzBdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHhbMV0pO3RyeXtzLnBia2RmMkl0ZXI9cGFyc2VJbnQodSwxNil9Y2F0Y2godil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQgcGJrZGYySXRlcjogXCIrdX1yZXR1cm4gc30sZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtOmZ1bmN0aW9uKHUscCl7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1LnBia2RmMlNhbHQpO3ZhciBxPXUucGJrZGYySXRlcjt2YXIgcz1DcnlwdG9KUy5QQktERjIocCx0LHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOnF9KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShzKTtyZXR1cm4gcn0sZ2V0UGxhaW5QS0NTOEhleEZyb21FbmNyeXB0ZWRQS0NTOFBFTTpmdW5jdGlvbih4LHkpe3ZhciByPXRoaXMuZ2V0SGV4RnJvbVBFTSh4LFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMucGFyc2VIZXhPZkVuY3J5cHRlZFBLQ1M4KHIpO3ZhciB1PUtFWVVUSUwuZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtKHAseSk7dmFyIHY9e307di5jaXBoZXJ0ZXh0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocC5jaXBoZXJ0ZXh0KTt2YXIgdD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBzPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocC5lbmNyeXB0aW9uU2NoZW1lSVYpO3ZhciB3PUNyeXB0b0pTLlRyaXBsZURFUy5kZWNyeXB0KHYsdCx7aXY6c30pO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHcpO3JldHVybiBxfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocyxyKXt2YXIgcT10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocyxyKTt2YXIgcD10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KHEpO3JldHVybiBwfSxnZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocyxxKXt2YXIgcD10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocyxxKTt2YXIgcj10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChwKTtyZXR1cm4gcn0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcT17fTtxLmFsZ3BhcmFtPW51bGw7aWYocy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYocy5zdWJzdHIoclsxXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsclsxXSk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifXEuYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMscFswXSk7aWYocy5zdWJzdHIocFsxXSwyKT09XCIwNlwiKXtxLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHMscFsxXSl9aWYocy5zdWJzdHIoclsyXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA2KVwifXEua2V5aWR4PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocyxyWzJdKTtyZXR1cm4gcX0sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShxLFwiUFJJVkFURSBLRVlcIik7dmFyIHI9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7cmV0dXJuIHJ9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihwKXt2YXIgdz10aGlzLnBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7aWYody5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmoocCx3KTt2YXIgdT13LmtleTt2YXIgej1uZXcgUlNBS2V5KCk7ei5zZXRQcml2YXRlRXgodS5uLHUuZSx1LmQsdS5wLHUucSx1LmRwLHUuZHEsdS5jbyk7cmV0dXJuIHp9ZWxzZXtpZih3LmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmoocCx3KTtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbdy5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIit3LmFsZ3BhcmFtfXZhciB2PUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVt3LmFsZ3BhcmFtXTt2YXIgej1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnZ9KTt6LnNldFB1YmxpY0tleUhleCh3LnB1YmtleSk7ei5zZXRQcml2YXRlS2V5SGV4KHcua2V5KTt6LmlzUHVibGljPWZhbHNlO3JldHVybiB6fWVsc2V7aWYody5hbGdvaWQ9PVwiMmE4NjQ4Y2UzODA0MDFcIil7dmFyIHQ9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMSwxLDBdLFwiMDJcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMSwxLDFdLFwiMDJcIik7dmFyIHk9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMSwxLDJdLFwiMDJcIik7dmFyIEI9QVNOMUhFWC5nZXRWYnlMaXN0KHAsMCxbMiwwXSxcIjAyXCIpO3ZhciByPW5ldyBCaWdJbnRlZ2VyKHQsMTYpO3ZhciBxPW5ldyBCaWdJbnRlZ2VyKHMsMTYpO3ZhciB4PW5ldyBCaWdJbnRlZ2VyKHksMTYpO3ZhciBBPW5ldyBCaWdJbnRlZ2VyKEIsMTYpO3ZhciB6PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt6LnNldFByaXZhdGUocixxLHgsbnVsbCxBKTtyZXR1cm4gen1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwcml2YXRlIGtleSBhbGdvcml0aG1cIn19fX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciByPXRoaXMuZ2V0SGV4RnJvbVBFTShxLFwiUFVCTElDIEtFWVwiKTt2YXIgcD10aGlzLmdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleChyKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKHEpe3ZhciByPXRoaXMuZ2V0SGV4RnJvbVBFTShxLFwiUFVCTElDIEtFWVwiKTt2YXIgcD10aGlzLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChyKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBwPXRoaXMucGFyc2VQdWJsaWNQS0NTOEhleChxKTtpZihwLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIHU9dGhpcy5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChwLmtleSk7dmFyIHI9bmV3IFJTQUtleSgpO3Iuc2V0UHVibGljKHUubix1LmUpO3JldHVybiByfWVsc2V7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrcC5hbGdwYXJhbX12YXIgcz1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV07dmFyIHI9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpzLHB1YjpwLmtleX0pO3JldHVybiByfWVsc2V7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4Y2UzODA0MDFcIil7dmFyIHQ9cC5hbGdwYXJhbTt2YXIgdj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLmtleSwwKTt2YXIgcj1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ci5zZXRQdWJsaWMobmV3IEJpZ0ludGVnZXIodC5wLDE2KSxuZXcgQmlnSW50ZWdlcih0LnEsMTYpLG5ldyBCaWdJbnRlZ2VyKHQuZywxNiksbmV3IEJpZ0ludGVnZXIodiwxNikpO3JldHVybiByfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnb3JpdGhtXCJ9fX19LHBhcnNlUHVibGljUmF3UlNBS2V5SGV4OmZ1bmN0aW9uKHIpe3ZhciBwPXt9O2lmKHIuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAxKVwifXZhciBxPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHIsMCk7aWYocS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMilcIn1pZihyLnN1YnN0cihxWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMylcIn1wLm49QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixxWzBdKTtpZihyLnN1YnN0cihxWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwNClcIn1wLmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixxWzFdKTtyZXR1cm4gcH0scGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmo6ZnVuY3Rpb24ocSxzKXt2YXIgcj1zLmtleWlkeDtpZihxLnN1YnN0cihyLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscik7aWYocC5sZW5ndGghPTkpe3Rocm93XCJtYWxmb3JtZWQgUlNBIHByaXZhdGUga2V5KGNvZGU6MDAyKVwifXMua2V5PXt9O3Mua2V5Lm49QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzFdKTtzLmtleS5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsyXSk7cy5rZXkuZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbM10pO3Mua2V5LnA9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzRdKTtzLmtleS5xPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs1XSk7cy5rZXkuZHA9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzZdKTtzLmtleS5kcT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbN10pO3Mua2V5LmNvPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs4XSl9LHBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmo6ZnVuY3Rpb24ocCx0KXt2YXIgcT10LmtleWlkeDt2YXIgcj1BU04xSEVYLmdldFZieUxpc3QocCxxLFsxXSxcIjA0XCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdChwLHEsWzIsMF0sXCIwM1wiKS5zdWJzdHIoMik7dC5rZXk9cjt0LnB1YmtleT1zfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciBxPXt9O3EuYWxncGFyYW09bnVsbDt2YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIityLmxlbmd0aH12YXIgdD1yWzBdO2lmKHMuc3Vic3RyKHQsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsdCk7aWYocC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZihzLnN1YnN0cihwWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1xLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMF0pO2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMDZcIil7cS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMV0pfWVsc2V7aWYocy5zdWJzdHIocFsxXSwyKT09XCIzMFwiKXtxLmFsZ3BhcmFtPXt9O3EuYWxncGFyYW0ucD1BU04xSEVYLmdldFZieUxpc3QocyxwWzFdLFswXSxcIjAyXCIpO3EuYWxncGFyYW0ucT1BU04xSEVYLmdldFZieUxpc3QocyxwWzFdLFsxXSxcIjAyXCIpO3EuYWxncGFyYW0uZz1BU04xSEVYLmdldFZieUxpc3QocyxwWzFdLFsyXSxcIjAyXCIpfX1pZihzLnN1YnN0cihyWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwNClcIn1xLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHJbMV0pLnN1YnN0cigyKTtyZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHQpe3ZhciBzPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHQsMCk7aWYocy5sZW5ndGghPTIpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3MubGVuZ3RofXZhciByPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoodCxzWzBdKTtpZihyIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWQgaXMgbm90IHJzYUVuY3J5cHRpb25cIn1pZih0LnN1YnN0cihzWzFdLDIpIT1cIjAzXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBCSVRTVFJJTkcgZW5jYXBzbGF0ZWQuXCJ9dmFyIHY9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaih0LHNbMV0pKzI7aWYodC5zdWJzdHIodiwyKSE9XCIzMFwiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgU0VRVUVOQ0UuXCJ9dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodCx2KTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcImlubmVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcC5sZW5ndGh9aWYodC5zdWJzdHIocFswXSwyKSE9XCIwMlwiKXt0aHJvd1wiTiBpcyBub3QgQVNOLjEgSU5URUdFUlwifWlmKHQuc3Vic3RyKHBbMV0sMikhPVwiMDJcIil7dGhyb3dcIkUgaXMgbm90IEFTTi4xIElOVEVHRVJcIn12YXIgdz1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LHBbMF0pO3ZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHQscFsxXSk7dmFyIHE9bmV3IFJTQUtleSgpO3Euc2V0UHVibGljKHcsdSk7cmV0dXJuIHF9LH19KCk7S0VZVVRJTC5nZXRLZXk9ZnVuY3Rpb24oZixlLGgpe2lmKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBSU0FLZXkpe3JldHVybiBmfWlmKHR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXtyZXR1cm4gZn1pZih0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXtyZXR1cm4gZn1pZihmLmN1cnZlIT09dW5kZWZpbmVkJiZmLnh5IT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3JldHVybiBuZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe3B1YjpmLnh5LGN1cnZlOmYuY3VydmV9KX1pZihmLmN1cnZlIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3JldHVybiBuZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe3BydjpmLmQsY3VydmU6Zi5jdXJ2ZX0pfWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQdWJsaWMoZi5uLGYuZSk7cmV0dXJuIHd9aWYoZi5rdHk9PT11bmRlZmluZWQmJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQmJmYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmRwIT09dW5kZWZpbmVkJiZmLmRxIT09dW5kZWZpbmVkJiZmLmNvIT09dW5kZWZpbmVkJiZmLnFpPT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQcml2YXRlRXgoZi5uLGYuZSxmLmQsZi5wLGYucSxmLmRwLGYuZHEsZi5jbyk7cmV0dXJuIHd9aWYoZi5rdHk9PT11bmRlZmluZWQmJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQmJmYucD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZShmLm4sZi5lLGYuZCk7cmV0dXJuIHd9aWYoZi5wIT09dW5kZWZpbmVkJiZmLnEhPT11bmRlZmluZWQmJmYuZyE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLng9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFB1YmxpYyhmLnAsZi5xLGYuZyxmLnkpO3JldHVybiB3fWlmKGYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmchPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQcml2YXRlKGYucCxmLnEsZi5nLGYueSxmLngpO3JldHVybiB3fWlmKGYua3R5PT09XCJSU0FcIiYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHVibGljKGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQmJmYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmRwIT09dW5kZWZpbmVkJiZmLmRxIT09dW5kZWZpbmVkJiZmLnFpIT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5zZXRQcml2YXRlRXgoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSksYjY0dXRvaGV4KGYuZCksYjY0dXRvaGV4KGYucCksYjY0dXRvaGV4KGYucSksYjY0dXRvaGV4KGYuZHApLGI2NHV0b2hleChmLmRxKSxiNjR1dG9oZXgoZi5xaSkpO3JldHVybiB3fWlmKGYua3R5PT09XCJSU0FcIiYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZShiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSxiNjR1dG9oZXgoZi5kKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIkVDXCImJmYuY3J2IT09dW5kZWZpbmVkJiZmLnghPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXt2YXIgZD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmYuY3J2fSk7dmFyIGw9ZC5lY3BhcmFtcy5rZXlsZW4vNDt2YXIgcj0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYueCkpLnNsaWNlKC1sKTt2YXIgbj0oXCIwMDAwMDAwMDAwXCIrYjY0dXRvaGV4KGYueSkpLnNsaWNlKC1sKTt2YXIgbT1cIjA0XCIrcituO2Quc2V0UHVibGljS2V5SGV4KG0pO3JldHVybiBkfWlmKGYua3R5PT09XCJFQ1wiJiZmLmNydiE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYuZCE9PXVuZGVmaW5lZCl7dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpmLmNydn0pO3ZhciBsPWQuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIGE9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLmQpKS5zbGljZSgtbCk7ZC5zZXRQcml2YXRlS2V5SGV4KGEpO3JldHVybiBkfWlmKGYuaW5kZXhPZihcIi1FTkQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxmLmluZGV4T2YoXCItRU5EIFg1MDkgQ0VSVElGSUNBVEUtXCIsMCkhPS0xfHxmLmluZGV4T2YoXCItRU5EIFRSVVNURUQgQ0VSVElGSUNBVEUtXCIsMCkhPS0xKXtyZXR1cm4gWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShmKX1pZihoPT09XCJwa2NzOHB1YlwiKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgoZil9aWYoZi5pbmRleE9mKFwiLUVORCBQVUJMSUMgS0VZLVwiKSE9LTEpe3JldHVybiBLRVlVVElMLmdldEtleUZyb21QdWJsaWNQS0NTOFBFTShmKX1pZihoPT09XCJwa2NzNXBydlwiKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGYpO3JldHVybiB3fWlmKGg9PT1cInBrY3M1cHJ2XCIpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZik7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgaT1LRVlVVElMLmdldEhleEZyb21QRU0oZixcIlJTQSBQUklWQVRFIEtFWVwiKTtyZXR1cm4gS0VZVVRJTC5nZXRLZXkoaSxudWxsLFwicGtjczVwcnZcIil9aWYoZi5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIik9PS0xKXt2YXIgdT10aGlzLmdldEhleEZyb21QRU0oZixcIkRTQSBQUklWQVRFIEtFWVwiKTt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzJdLFwiMDJcIik7dmFyIHY9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbM10sXCIwMlwiKTt2YXIgaj1BU04xSEVYLmdldFZieUxpc3QodSwwLFs0XSxcIjAyXCIpO3ZhciBrPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzVdLFwiMDJcIik7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcih0LDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSxuZXcgQmlnSW50ZWdlcihqLDE2KSxuZXcgQmlnSW50ZWdlcihrLDE2KSk7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhQRU0oZil9aWYoZi5pbmRleE9mKFwiLUVORCBSU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU0oZixlKX1pZihmLmluZGV4T2YoXCItRU5EIEVDIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIHU9S0VZVVRJTC5nZXREZWNyeXB0ZWRLZXlIZXgoZixlKTt2YXIgdz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjA0XCIpO3ZhciBjPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzIsMF0sXCIwNlwiKTt2YXIgbz1BU04xSEVYLmdldFZieUxpc3QodSwwLFszLDBdLFwiMDNcIikuc3Vic3RyKDIpO3ZhciBiPVwiXCI7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW2NdIT09dW5kZWZpbmVkKXtiPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjXX1lbHNle3Rocm93XCJ1bmRlZmluZWQgT0lEKGhleCkgaW4gS0pVUi5jcnlwdG8uT0lEOiBcIitjfXZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7bmFtZTpifSk7ZC5zZXRQdWJsaWNLZXlIZXgobyk7ZC5zZXRQcml2YXRlS2V5SGV4KHcpO2QuaXNQdWJsaWM9ZmFsc2U7cmV0dXJuIGR9aWYoZi5pbmRleE9mKFwiLUVORCBEU0EgUFJJVkFURSBLRVktXCIpIT0tMSYmZi5pbmRleE9mKFwiNCxFTkNSWVBURURcIikhPS0xKXt2YXIgdT1LRVlVVElMLmdldERlY3J5cHRlZEtleUhleChmLGUpO3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzFdLFwiMDJcIik7dmFyIHM9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMl0sXCIwMlwiKTt2YXIgdj1BU04xSEVYLmdldFZieUxpc3QodSwwLFszXSxcIjAyXCIpO3ZhciBqPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzRdLFwiMDJcIik7dmFyIGs9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNV0sXCIwMlwiKTt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHQsMTYpLG5ldyBCaWdJbnRlZ2VyKHMsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpLG5ldyBCaWdJbnRlZ2VyKGosMTYpLG5ldyBCaWdJbnRlZ2VyKGssMTYpKTtyZXR1cm4gd31pZihmLmluZGV4T2YoXCItRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU0oZixlKX10aHJvd1wibm90IHN1cHBvcnRlZCBhcmd1bWVudFwifTtLRVlVVElMLmdlbmVyYXRlS2V5cGFpcj1mdW5jdGlvbihhLGMpe2lmKGE9PVwiUlNBXCIpe3ZhciBiPWM7dmFyIGg9bmV3IFJTQUtleSgpO2guZ2VuZXJhdGUoYixcIjEwMDAxXCIpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz10cnVlO3ZhciBmPW5ldyBSU0FLZXkoKTt2YXIgZT1oLm4udG9TdHJpbmcoMTYpO3ZhciBpPWguZS50b1N0cmluZygxNik7Zi5zZXRQdWJsaWMoZSxpKTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7aWYoYT09XCJFQ1wiKXt2YXIgZD1jO3ZhciBnPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO3ZhciBqPWcuZ2VuZXJhdGVLZXlQYWlySGV4KCk7dmFyIGg9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7aC5zZXRQcml2YXRlS2V5SGV4KGouZWNwcnZoZXgpO2guaXNQcml2YXRlPXRydWU7aC5pc1B1YmxpYz1mYWxzZTt2YXIgZj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTtmLnNldFB1YmxpY0tleUhleChqLmVjcHViaGV4KTtmLmlzUHJpdmF0ZT1mYWxzZTtmLmlzUHVibGljPXRydWU7dmFyIGs9e307ay5wcnZLZXlPYmo9aDtrLnB1YktleU9iaj1mO3JldHVybiBrfWVsc2V7dGhyb3dcInVua25vd24gYWxnb3JpdGhtOiBcIithfX19O0tFWVVUSUwuZ2V0UEVNPWZ1bmN0aW9uKGEscixvLGcsail7dmFyIHY9S0pVUi5hc24xO3ZhciB1PUtKVVIuY3J5cHRvO2Z1bmN0aW9uIHAocyl7dmFyIHc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7XCJpbnRcIjp7YmlnaW50OnMubn19LHtcImludFwiOnMuZX0se1wiaW50XCI6e2JpZ2ludDpzLmR9fSx7XCJpbnRcIjp7YmlnaW50OnMucH19LHtcImludFwiOntiaWdpbnQ6cy5xfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcDF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZG1xMX19LHtcImludFwiOntiaWdpbnQ6cy5jb2VmZn19XX0pO3JldHVybiB3fWZ1bmN0aW9uIHEodyl7dmFyIHM9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6dy5wcnZLZXlIZXh9fSx7dGFnOltcImEwXCIsdHJ1ZSx7b2lkOntuYW1lOncuY3VydmVOYW1lfX1dfSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK3cucHViS2V5SGV4fX1dfV19KTtyZXR1cm4gc31mdW5jdGlvbiBuKHMpe3ZhciB3PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5nfX0se1wiaW50XCI6e2JpZ2ludDpzLnl9fSx7XCJpbnRcIjp7YmlnaW50OnMueH19XX0pO3JldHVybiB3fWlmKCgodHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSl8fCh0eXBlb2YgdS5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiB1LkRTQSl8fCh0eXBlb2YgdS5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIHUuRUNEU0EpKSYmYS5pc1B1YmxpYz09dHJ1ZSYmKHI9PT11bmRlZmluZWR8fHI9PVwiUEtDUzhQVUJcIikpe3ZhciB0PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQVUJMSUMgS0VZXCIpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmKG89PT11bmRlZmluZWR8fG89PW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cChhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJSU0EgUFJJVkFURSBLRVlcIil9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTphLmN1cnZlTmFtZX0pO3ZhciBsPWYuZ2V0RW5jb2RlZEhleCgpO3ZhciBlPXEoYSk7dmFyIGs9ZS5nZXRFbmNvZGVkSGV4KCk7dmFyIGk9XCJcIjtpKz12LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobCxcIkVDIFBBUkFNRVRFUlNcIik7aSs9di5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFQyBQUklWQVRFIEtFWVwiKTtyZXR1cm4gaX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PW4oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiRFNBIFBSSVZBVEUgS0VZXCIpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9cChhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIsbSxvLGcpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXEoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkVDXCIsbSxvLGcpfWlmKHI9PVwiUEtDUzVQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmKG8hPT11bmRlZmluZWQmJm8hPW51bGwpJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIHQ9bihhKTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihnPT09dW5kZWZpbmVkKXtnPVwiREVTLUVERTMtQ0JDXCJ9cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiRFNBXCIsbSxvLGcpfXZhciBoPWZ1bmN0aW9uKHcscyl7dmFyIHk9Yih3LHMpO3ZhciB4PW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tzZXE6W3tvaWQ6e25hbWU6XCJwa2NzNVBCRVMyXCJ9fSx7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQktERjJcIn19LHtzZXE6W3tvY3RzdHI6e2hleDp5LnBia2RmMlNhbHR9fSx7XCJpbnRcIjp5LnBia2RmMkl0ZXJ9XX1dfSx7c2VxOlt7b2lkOntuYW1lOlwiZGVzLUVERTMtQ0JDXCJ9fSx7b2N0c3RyOntoZXg6eS5lbmNyeXB0aW9uU2NoZW1lSVZ9fV19XX1dfSx7b2N0c3RyOntoZXg6eS5jaXBoZXJ0ZXh0fX1dfSk7cmV0dXJuIHguZ2V0RW5jb2RlZEhleCgpfTt2YXIgYj1mdW5jdGlvbihELEUpe3ZhciB4PTEwMDt2YXIgQz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgQj1cIkRFUy1FREUzLUNCQ1wiO3ZhciBzPUNyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDgpO3ZhciB5PUNyeXB0b0pTLlBCS0RGMihFLEMse2tleVNpemU6MTkyLzMyLGl0ZXJhdGlvbnM6eH0pO3ZhciB6PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UoRCk7dmFyIEE9Q3J5cHRvSlMuVHJpcGxlREVTLmVuY3J5cHQoeix5LHtpdjpzfSkrXCJcIjt2YXIgdz17fTt3LmNpcGhlcnRleHQ9QTt3LnBia2RmMlNhbHQ9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkoQyk7dy5wYmtkZjJJdGVyPXg7dy5lbmNyeXB0aW9uU2NoZW1lQWxnPUI7dy5lbmNyeXB0aW9uU2NoZW1lSVY9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHd9O2lmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIFJTQUtleSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPXAoYSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwicnNhRW5jcnlwdGlvblwifX0se1wibnVsbFwiOnRydWV9XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkVDRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0EmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjoxfSx7b2N0c3RyOntoZXg6YS5wcnZLZXlIZXh9fSx7dGFnOltcImExXCIsdHJ1ZSx7Yml0c3RyOntoZXg6XCIwMFwiK2EucHViS2V5SGV4fX1dfV19KTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJlY1B1YmxpY0tleVwifX0se29pZDp7bmFtZTphLmN1cnZlTmFtZX19XX0se29jdHN0cjp7aGV4OmN9fV19KTt2YXIgbT10LmdldEVuY29kZWRIZXgoKTtpZihvPT09dW5kZWZpbmVkfHxvPT1udWxsKXtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KG0sXCJQUklWQVRFIEtFWVwiKX1lbHNle3ZhciBrPWgobSxvKTtyZXR1cm4gdi5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGssXCJFTkNSWVBURUQgUFJJVkFURSBLRVlcIil9fWlmKHI9PVwiUEtDUzhQUlZcIiYmdHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmEueH0pO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcImRzYVwifX0se3NlcTpbe1wiaW50XCI6e2JpZ2ludDphLnB9fSx7XCJpbnRcIjp7YmlnaW50OmEucX19LHtcImludFwiOntiaWdpbnQ6YS5nfX1dfV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX10aHJvd1widW5zdXBwb3J0ZWQgb2JqZWN0IG5vciBmb3JtYXRcIn07S0VZVVRJTC5nZXRLZXlGcm9tQ1NSUEVNPWZ1bmN0aW9uKGIpe3ZhciBhPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShiLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTt2YXIgYz1LRVlVVElMLmdldEtleUZyb21DU1JIZXgoYSk7cmV0dXJuIGN9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUkhleD1mdW5jdGlvbihhKXt2YXIgYz1LRVlVVElMLnBhcnNlQ1NSSGV4KGEpO3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMucDhwdWJrZXloZXgsbnVsbCxcInBrY3M4cHViXCIpO3JldHVybiBifTtLRVlVVElMLnBhcnNlQ1NSSGV4PWZ1bmN0aW9uKGMpe3ZhciBiPXt9O3ZhciBlPWM7aWYoZS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMSlcIn12YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2lmKGQubGVuZ3RoPDEpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAyKVwifWlmKGUuc3Vic3RyKGRbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDMpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkWzBdKTtpZihhLmxlbmd0aDwzKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwNClcIn1iLnA4cHVia2V5aGV4PUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZSxhWzJdKTtyZXR1cm4gYn07XG4vKiEgcnNhcGVtLTEuMS5qcyAoYykgMjAxMiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiBfcnNhcGVtX3BlbVRvQmFzZTY0KGIpe3ZhciBhPWI7YT1hLnJlcGxhY2UoXCItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXCIsXCJcIik7YT1hLnJlcGxhY2UoXCItLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpO2E9YS5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7cmV0dXJuIGF9ZnVuY3Rpb24gX3JzYXBlbV9nZXRQb3NBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGQpe3ZhciBqPW5ldyBBcnJheSgpO3ZhciBrPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZCwwKTt2YXIgZj1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxrKTt2YXIgaD1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxmKTt2YXIgYj1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxoKTt2YXIgbD1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxiKTt2YXIgZT1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxsKTt2YXIgZz1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxlKTt2YXIgYz1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxnKTt2YXIgaT1BU04xSEVYLmdldFBvc09mTmV4dFNpYmxpbmdfQXRPYmooZCxjKTtqLnB1c2goayxmLGgsYixsLGUsZyxjLGkpO3JldHVybiBqfWZ1bmN0aW9uIF9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpe3ZhciBvPV9yc2FwZW1fZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleChpKTt2YXIgcj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMF0pO3ZhciBmPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1sxXSk7dmFyIGo9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzJdKTt2YXIgaz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bM10pO3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s0XSk7dmFyIGI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzVdKTt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNl0pO3ZhciBnPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s3XSk7dmFyIGw9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzhdKTt2YXIgbT1uZXcgQXJyYXkoKTttLnB1c2gocixmLGosayxjLGIsaCxnLGwpO3JldHVybiBtfWZ1bmN0aW9uIF9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhjKXt2YXIgYj1fcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChjKTt0aGlzLnNldFByaXZhdGVFeChiWzFdLGJbMl0sYlszXSxiWzRdLGJbNV0sYls2XSxiWzddLGJbOF0pfWZ1bmN0aW9uIF9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tUEVNU3RyaW5nKGUpe3ZhciBjPV9yc2FwZW1fcGVtVG9CYXNlNjQoZSk7dmFyIGQ9YjY0dG9oZXgoYyk7dmFyIGI9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoZCk7dGhpcy5zZXRQcml2YXRlRXgoYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxiWzhdKX1SU0FLZXkucHJvdG90eXBlLnJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZz1fcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZztSU0FLZXkucHJvdG90eXBlLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmc9X3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nO1xuLyohIHJzYXNpZ24tMS4yLjcuanMgKGMpIDIwMTIgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xudmFyIF9SRV9IRVhERUNPTkxZPW5ldyBSZWdFeHAoXCJcIik7X1JFX0hFWERFQ09OTFkuY29tcGlsZShcIlteMC05YS1mXVwiLFwiZ2lcIik7ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4UGFkZGVkRGlnZXN0SW5mb0ZvclN0cmluZyhkLGUsYSl7dmFyIGI9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhmLGEpfTt2YXIgYz1iKGQpO3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoYyxhLGUpfWZ1bmN0aW9uIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGUsZCl7dmFyIGM9XCJcIjt2YXIgYT1kLzQtZS5sZW5ndGg7Zm9yKHZhciBiPTA7YjxhO2IrKyl7Yz1jK1wiMFwifXJldHVybiBjK2V9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZyhkLGEpe3ZhciBiPWZ1bmN0aW9uKGUpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoZSxhKX07dmFyIGM9YihkKTtyZXR1cm4gdGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoKGMsYSl9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaChlLGMpe3ZhciBmPUtKVVIuY3J5cHRvLlV0aWwuZ2V0UGFkZGVkRGlnZXN0SW5mb0hleChlLGMsdGhpcy5uLmJpdExlbmd0aCgpKTt2YXIgYj1wYXJzZUJpZ0ludChmLDE2KTt2YXIgZD10aGlzLmRvUHJpdmF0ZShiKTt2YXIgYT1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUoYSx0aGlzLm4uYml0TGVuZ3RoKCkpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMShhKXtyZXR1cm4gX3JzYXNpZ25fc2lnblN0cmluZy5jYWxsKHRoaXMsYSxcInNoYTFcIil9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTYoYSl7cmV0dXJuIF9yc2FzaWduX3NpZ25TdHJpbmcuY2FsbCh0aGlzLGEsXCJzaGEyNTZcIil9ZnVuY3Rpb24gcHNzX21nZjFfc3RyKGMsYSxlKXt2YXIgYj1cIlwiLGQ9MDt3aGlsZShiLmxlbmd0aDxhKXtiKz1oZXh0b3JzdHIoZShyc3RydG9oZXgoYytTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxbKGQmNDI3ODE5MDA4MCk+PjI0LChkJjE2NzExNjgwKT4+MTYsKGQmNjUyODApPj44LGQmMjU1XSkpKSk7ZCs9MX1yZXR1cm4gYn1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nUFNTKGUsYSxkKXt2YXIgYz1mdW5jdGlvbihmKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGYsYSl9O3ZhciBiPWMocnN0cnRvaGV4KGUpKTtpZihkPT09dW5kZWZpbmVkKXtkPS0xfXJldHVybiB0aGlzLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1MoYixhLGQpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2hQU1MobCxhLGspe3ZhciBiPWhleHRvcnN0cihsKTt2YXIgZz1iLmxlbmd0aDt2YXIgbT10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgYz1NYXRoLmNlaWwobS84KTt2YXIgZDt2YXIgbz1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksYSl9O2lmKGs9PT0tMXx8az09PXVuZGVmaW5lZCl7az1nfWVsc2V7aWYoaz09PS0yKXtrPWMtZy0yfWVsc2V7aWYoazwtMil7dGhyb3dcImludmFsaWQgc2FsdCBsZW5ndGhcIn19fWlmKGM8KGcraysyKSl7dGhyb3dcImRhdGEgdG9vIGxvbmdcIn12YXIgZj1cIlwiO2lmKGs+MCl7Zj1uZXcgQXJyYXkoayk7bmV3IFNlY3VyZVJhbmRvbSgpLm5leHRCeXRlcyhmKTtmPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGYpfXZhciBuPWhleHRvcnN0cihvKHJzdHJ0b2hleChcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIitiK2YpKSk7dmFyIGo9W107Zm9yKGQ9MDtkPGMtay1nLTI7ZCs9MSl7altkXT0wfXZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGopK1wiXFx4MDFcIitmO3ZhciBoPXBzc19tZ2YxX3N0cihuLGUubGVuZ3RoLG8pO3ZhciBxPVtdO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKz0xKXtxW2RdPWUuY2hhckNvZGVBdChkKV5oLmNoYXJDb2RlQXQoZCl9dmFyIHA9KDY1MjgwPj4oOCpjLW0pKSYyNTU7cVswXSY9fnA7Zm9yKGQ9MDtkPGc7ZCsrKXtxLnB1c2gobi5jaGFyQ29kZUF0KGQpKX1xLnB1c2goMTg4KTtyZXR1cm4gX3plcm9QYWRkaW5nT2ZTaWduYXR1cmUodGhpcy5kb1ByaXZhdGUobmV3IEJpZ0ludGVnZXIocSkpLnRvU3RyaW5nKDE2KSx0aGlzLm4uYml0TGVuZ3RoKCkpfWZ1bmN0aW9uIF9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGQsYyl7dmFyIGI9bmV3IFJTQUtleSgpO2Iuc2V0UHVibGljKGQsYyk7dmFyIGU9Yi5kb1B1YmxpYyhhKTtyZXR1cm4gZX1mdW5jdGlvbiBfcnNhc2lnbl9nZXRIZXhEaWdlc3RJbmZvRnJvbVNpZyhhLGMsYil7dmFyIGU9X3JzYXNpZ25fZ2V0RGVjcnlwdFNpZ25hdHVyZUJJKGEsYyxiKTt2YXIgZD1lLnRvU3RyaW5nKDE2KS5yZXBsYWNlKC9eMWYrMDAvLFwiXCIpO3JldHVybiBkfWZ1bmN0aW9uIF9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGYpe2Zvcih2YXIgZSBpbiBLSlVSLmNyeXB0by5VdGlsLkRJR0VTVElORk9IRUFEKXt2YXIgZD1LSlVSLmNyeXB0by5VdGlsLkRJR0VTVElORk9IRUFEW2VdO3ZhciBiPWQubGVuZ3RoO2lmKGYuc3Vic3RyaW5nKDAsYik9PWQpe3ZhciBjPVtlLGYuc3Vic3RyaW5nKGIpXTtyZXR1cm4gY319cmV0dXJuW119ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5U2lnbmF0dXJlV2l0aEFyZ3MoZixiLGcsail7dmFyIGU9X3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYixnLGopO3ZhciBoPV9yc2FzaWduX2dldEFsZ05hbWVBbmRIYXNoRnJvbUhleERpc2dlc3RJbmZvKGUpO2lmKGgubGVuZ3RoPT0wKXtyZXR1cm4gZmFsc2V9dmFyIGQ9aFswXTt2YXIgaT1oWzFdO3ZhciBhPWZ1bmN0aW9uKGspe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoayxkKX07dmFyIGM9YShmKTtyZXR1cm4oaT09Yyl9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZShjLGIpe3ZhciBkPXBhcnNlQmlnSW50KGMsMTYpO3ZhciBhPV9yc2FzaWduX3ZlcmlmeVNpZ25hdHVyZVdpdGhBcmdzKGIsZCx0aGlzLm4udG9TdHJpbmcoMTYpLHRoaXMuZS50b1N0cmluZygxNikpO3JldHVybiBhfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVN0cmluZyhmLGope2o9ai5yZXBsYWNlKF9SRV9IRVhERUNPTkxZLFwiXCIpO2o9ai5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7dmFyIGI9cGFyc2VCaWdJbnQoaiwxNik7aWYoYi5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiAwfXZhciBpPXRoaXMuZG9QdWJsaWMoYik7dmFyIGU9aS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTt2YXIgZz1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhlKTtpZihnLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWdbMF07dmFyIGg9Z1sxXTt2YXIgYT1mdW5jdGlvbihrKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGssZCl9O3ZhciBjPWEoZik7cmV0dXJuKGg9PWMpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaChlLGEpe2E9YS5yZXBsYWNlKF9SRV9IRVhERUNPTkxZLFwiXCIpO2E9YS5yZXBsYWNlKC9bIFxcbl0rL2csXCJcIik7dmFyIGI9cGFyc2VCaWdJbnQoYSwxNik7aWYoYi5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiAwfXZhciBoPXRoaXMuZG9QdWJsaWMoYik7dmFyIGc9aC50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTt2YXIgYz1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhnKTtpZihjLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWNbMF07dmFyIGY9Y1sxXTtyZXR1cm4oZj09ZSl9ZnVuY3Rpb24gX3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTKGMsYixhLGYpe3ZhciBlPWZ1bmN0aW9uKGcpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoZyxhKX07dmFyIGQ9ZShyc3RydG9oZXgoYykpO2lmKGY9PT11bmRlZmluZWQpe2Y9LTF9cmV0dXJuIHRoaXMudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKGQsYixhLGYpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyhmLHMsbCxjKXt2YXIgaz1uZXcgQmlnSW50ZWdlcihzLDE2KTtpZihrLmJpdExlbmd0aCgpPnRoaXMubi5iaXRMZW5ndGgoKSl7cmV0dXJuIGZhbHNlfXZhciByPWZ1bmN0aW9uKGkpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoaSxsKX07dmFyIGo9aGV4dG9yc3RyKGYpO3ZhciBoPWoubGVuZ3RoO3ZhciBnPXRoaXMubi5iaXRMZW5ndGgoKS0xO3ZhciBtPU1hdGguY2VpbChnLzgpO3ZhciBxO2lmKGM9PT0tMXx8Yz09PXVuZGVmaW5lZCl7Yz1ofWVsc2V7aWYoYz09PS0yKXtjPW0taC0yfWVsc2V7aWYoYzwtMil7dGhyb3dcImludmFsaWQgc2FsdCBsZW5ndGhcIn19fWlmKG08KGgrYysyKSl7dGhyb3dcImRhdGEgdG9vIGxvbmdcIn12YXIgYT10aGlzLmRvUHVibGljKGspLnRvQnl0ZUFycmF5KCk7Zm9yKHE9MDtxPGEubGVuZ3RoO3ErPTEpe2FbcV0mPTI1NX13aGlsZShhLmxlbmd0aDxtKXthLnVuc2hpZnQoMCl9aWYoYVttLTFdIT09MTg4KXt0aHJvd1wiZW5jb2RlZCBtZXNzYWdlIGRvZXMgbm90IGVuZCBpbiAweGJjXCJ9YT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxhKTt2YXIgZD1hLnN1YnN0cigwLG0taC0xKTt2YXIgZT1hLnN1YnN0cihkLmxlbmd0aCxoKTt2YXIgcD0oNjUyODA+Pig4Km0tZykpJjI1NTtpZigoZC5jaGFyQ29kZUF0KDApJnApIT09MCl7dGhyb3dcImJpdHMgYmV5b25kIGtleXNpemUgbm90IHplcm9cIn12YXIgbj1wc3NfbWdmMV9zdHIoZSxkLmxlbmd0aCxyKTt2YXIgbz1bXTtmb3IocT0wO3E8ZC5sZW5ndGg7cSs9MSl7b1txXT1kLmNoYXJDb2RlQXQocSlebi5jaGFyQ29kZUF0KHEpfW9bMF0mPX5wO3ZhciBiPW0taC1jLTI7Zm9yKHE9MDtxPGI7cSs9MSl7aWYob1txXSE9PTApe3Rocm93XCJsZWZ0bW9zdCBvY3RldHMgbm90IHplcm9cIn19aWYob1tiXSE9PTEpe3Rocm93XCIweDAxIG1hcmtlciBub3QgZm91bmRcIn1yZXR1cm4gZT09PWhleHRvcnN0cihyKHJzdHJ0b2hleChcIlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcIitqK1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLG8uc2xpY2UoLWMpKSkpKX1SU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoTWVzc2FnZUhhc2g9X3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaDtSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmc9X3JzYXNpZ25fc2lnblN0cmluZztSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmdXaXRoU0hBMT1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTE7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nV2l0aFNIQTI1Nj1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTI1NjtSU0FLZXkucHJvdG90eXBlLnNpZ249X3JzYXNpZ25fc2lnblN0cmluZztSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoU0hBMT1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTE7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aFNIQTI1Nj1fcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTI1NjtSU0FLZXkucHJvdG90eXBlLnNpZ25XaXRoTWVzc2FnZUhhc2hQU1M9X3JzYXNpZ25fc2lnbldpdGhNZXNzYWdlSGFzaFBTUztSU0FLZXkucHJvdG90eXBlLnNpZ25TdHJpbmdQU1M9X3JzYXNpZ25fc2lnblN0cmluZ1BTUztSU0FLZXkucHJvdG90eXBlLnNpZ25QU1M9X3JzYXNpZ25fc2lnblN0cmluZ1BTUztSU0FLZXkuU0FMVF9MRU5fSExFTj0tMTtSU0FLZXkuU0FMVF9MRU5fTUFYPS0yO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoPV9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaDtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVN0cmluZz1fcnNhc2lnbl92ZXJpZnlTdHJpbmc7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlPV9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2U7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnk9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5SGV4U2lnbmF0dXJlRm9yQnl0ZUFycmF5TWVzc2FnZT1fcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTPV9yc2FzaWduX3ZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUztSU0FLZXkucHJvdG90eXBlLnZlcmlmeVN0cmluZ1BTUz1fcnNhc2lnbl92ZXJpZnlTdHJpbmdQU1M7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlQU1M9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTO1JTQUtleS5TQUxUX0xFTl9SRUNPVkVSPS0yO1xuLyohIHg1MDktMS4xLjguanMgKGMpIDIwMTItMjAxNiBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiBYNTA5KCl7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBPW51bGw7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPW51bGw7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPW51bGw7dGhpcy5oZXg9bnVsbDt0aGlzLmdldFNlcmlhbE51bWJlckhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwxXSl9O3RoaXMuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtRmllbGQ9ZnVuY3Rpb24oKXt2YXIgYj1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwyLDBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQoYik7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3JldHVybiBjfTt0aGlzLmdldElzc3VlckhleD1mdW5jdGlvbigpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDNdKX07dGhpcy5nZXRJc3N1ZXJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWDUwOS5oZXgyZG4oQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwzXSkpfTt0aGlzLmdldFN1YmplY3RIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw1XSl9O3RoaXMuZ2V0U3ViamVjdFN0cmluZz1mdW5jdGlvbigpe3JldHVybiBYNTA5LmhleDJkbihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDVdKSl9O3RoaXMuZ2V0Tm90QmVmb3JlPWZ1bmN0aW9uKCl7dmFyIGE9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNCwwXSk7YT1hLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTthPWRlY29kZVVSSUNvbXBvbmVudChhKTtyZXR1cm4gYX07dGhpcy5nZXROb3RBZnRlcj1mdW5jdGlvbigpe3ZhciBhPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDQsMV0pO2E9YS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7YT1kZWNvZGVVUklDb21wb25lbnQoYSk7cmV0dXJuIGF9O3RoaXMucmVhZENlcnRQRU09ZnVuY3Rpb24oYyl7dmFyIGU9WDUwOS5wZW1Ub0hleChjKTt2YXIgYj1YNTA5LmdldFB1YmxpY0tleUhleEFycmF5RnJvbUNlcnRIZXgoZSk7dmFyIGQ9bmV3IFJTQUtleSgpO2Quc2V0UHVibGljKGJbMF0sYlsxXSk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBPWQ7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPWJbMF07dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPWJbMV07dGhpcy5oZXg9ZX07dGhpcy5yZWFkQ2VydFBFTVdpdGhvdXRSU0FJbml0PWZ1bmN0aW9uKGMpe3ZhciBkPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGQpO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQS5zZXRQdWJsaWMoYlswXSxiWzFdKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaE49YlswXTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0FfaEU9YlsxXTt0aGlzLmhleD1kfTt0aGlzLmdldEluZm89ZnVuY3Rpb24oKXt2YXIgcD1cIkJhc2ljIEZpZWxkc1xcblwiO3ArPVwiICBzZXJpYWwgbnVtYmVyOiBcIit0aGlzLmdldFNlcmlhbE51bWJlckhleCgpK1wiXFxuXCI7cCs9XCIgIHNpZ25hdHVyZSBhbGdvcml0aG06IFwiK3RoaXMuZ2V0U2lnbmF0dXJlQWxnb3JpdGhtRmllbGQoKStcIlxcblwiO3ArPVwiICBpc3N1ZXI6IFwiK3RoaXMuZ2V0SXNzdWVyU3RyaW5nKCkrXCJcXG5cIjtwKz1cIiAgbm90QmVmb3JlOiBcIit0aGlzLmdldE5vdEJlZm9yZSgpK1wiXFxuXCI7cCs9XCIgIG5vdEFmdGVyOiBcIit0aGlzLmdldE5vdEFmdGVyKCkrXCJcXG5cIjtwKz1cIiAgc3ViamVjdDogXCIrdGhpcy5nZXRTdWJqZWN0U3RyaW5nKCkrXCJcXG5cIjtwKz1cIiAgc3ViamVjdCBwdWJsaWMga2V5IGluZm86IFxcblwiO3ZhciBqPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleCh0aGlzLmhleCk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaih0aGlzLmhleCxqKTt2YXIgbj1LRVlVVElMLmdldEtleShkLG51bGwsXCJwa2NzOHB1YlwiKTtpZihuIGluc3RhbmNlb2YgUlNBS2V5KXtwKz1cIiAgICBrZXkgYWxnb3JpdGhtOiBSU0FcXG5cIjtwKz1cIiAgICBuPVwiK24ubi50b1N0cmluZygxNikuc3Vic3RyKDAsMTYpK1wiLi4uXFxuXCI7cCs9XCIgICAgZT1cIituLmUudG9TdHJpbmcoMTYpK1wiXFxuXCJ9cCs9XCJYNTA5djMgRXh0ZW5zaW9uczpcXG5cIjt2YXIgbT1YNTA5LmdldFYzRXh0SW5mb0xpc3RPZkNlcnRIZXgodGhpcy5oZXgpO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgYj1tW2VdO3ZhciBvPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShiLm9pZCk7aWYobz09PVwiXCIpe289Yi5vaWR9dmFyIGs9XCJcIjtpZihiLmNyaXRpY2FsPT09dHJ1ZSl7az1cIkNSSVRJQ0FMXCJ9cCs9XCIgIFwiK28rXCIgXCIraytcIjpcXG5cIjtpZihvPT09XCJiYXNpY0NvbnN0cmFpbnRzXCIpe3ZhciBnPVg1MDkuZ2V0RXh0QmFzaWNDb25zdHJhaW50cyh0aGlzLmhleCk7aWYoZy5jQT09PXVuZGVmaW5lZCl7cCs9XCIgICAge31cXG5cIn1lbHNle3ArPVwiICAgIGNBPXRydWVcIjtpZihnLnBhdGhMZW4hPT11bmRlZmluZWQpe3ArPVwiLCBwYXRoTGVuPVwiK2cucGF0aExlbn1wKz1cIlxcblwifX1lbHNle2lmKG89PT1cImtleVVzYWdlXCIpe3ArPVwiICAgIFwiK1g1MDkuZ2V0RXh0S2V5VXNhZ2VTdHJpbmcodGhpcy5oZXgpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJzdWJqZWN0S2V5SWRlbnRpZmllclwiKXtwKz1cIiAgICBcIitYNTA5LmdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyKHRoaXMuaGV4KStcIlxcblwifWVsc2V7aWYobz09PVwiYXV0aG9yaXR5S2V5SWRlbnRpZmllclwiKXt2YXIgYT1YNTA5LmdldEV4dEF1dGhvcml0eUtleUlkZW50aWZpZXIodGhpcy5oZXgpO2lmKGEua2lkIT09dW5kZWZpbmVkKXtwKz1cIiAgICBraWQ9XCIrYS5raWQrXCJcXG5cIn19ZWxzZXtpZihvPT09XCJleHRLZXlVc2FnZVwiKXt2YXIgaD1YNTA5LmdldEV4dEV4dEtleVVzYWdlTmFtZSh0aGlzLmhleCk7cCs9XCIgICAgXCIraC5qb2luKFwiLCBcIikrXCJcXG5cIn1lbHNle2lmKG89PT1cInN1YmplY3RBbHROYW1lXCIpe3ZhciBmPVg1MDkuZ2V0RXh0U3ViamVjdEFsdE5hbWUodGhpcy5oZXgpO3ArPVwiICAgIFwiK2Yuam9pbihcIiwgXCIpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJjUkxEaXN0cmlidXRpb25Qb2ludHNcIil7dmFyIGw9WDUwOS5nZXRFeHRDUkxEaXN0cmlidXRpb25Qb2ludHNVUkkodGhpcy5oZXgpO3ArPVwiICAgIFwiK2wrXCJcXG5cIn1lbHNle2lmKG89PT1cImF1dGhvcml0eUluZm9BY2Nlc3NcIil7dmFyIGM9WDUwOS5nZXRFeHRBSUFJbmZvKHRoaXMuaGV4KTtpZihjLm9jc3AhPT11bmRlZmluZWQpe3ArPVwiICAgIG9jc3A6IFwiK2Mub2NzcC5qb2luKFwiLFwiKStcIlxcblwifWlmKGMuY2Fpc3N1ZXIhPT11bmRlZmluZWQpe3ArPVwiICAgIGNhaXNzdWVyOiBcIitjLmNhaXNzdWVyLmpvaW4oXCIsXCIpK1wiXFxuXCJ9fX19fX19fX19cCs9XCJzaWduYXR1cmUgYWxnb3JpdGhtOiBcIitYNTA5LmdldFNpZ25hdHVyZUFsZ29yaXRobU5hbWUodGhpcy5oZXgpK1wiXFxuXCI7cCs9XCJzaWduYXR1cmU6IFwiK1g1MDkuZ2V0U2lnbmF0dXJlVmFsdWVIZXgodGhpcy5oZXgpLnN1YnN0cigwLDE2KStcIi4uLlxcblwiO3JldHVybiBwfX1YNTA5LnBlbVRvQmFzZTY0PWZ1bmN0aW9uKGEpe3ZhciBiPWE7Yj1iLnJlcGxhY2UoXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cIixcIlwiKTtiPWIucmVwbGFjZShcIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cIixcIlwiKTtiPWIucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3JldHVybiBifTtYNTA5LnBlbVRvSGV4PWZ1bmN0aW9uKGEpe3ZhciBjPVg1MDkucGVtVG9CYXNlNjQoYSk7dmFyIGI9YjY0dG9oZXgoYyk7cmV0dXJuIGJ9O1g1MDkuZ2V0U3ViamVjdFB1YmxpY0tleVBvc0Zyb21DZXJ0SGV4PWZ1bmN0aW9uKGYpe3ZhciBlPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleChmKTtpZihlPT0tMSl7cmV0dXJuIC0xfXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZSk7aWYoYi5sZW5ndGghPTIpe3JldHVybiAtMX12YXIgZD1iWzFdO2lmKGYuc3Vic3RyaW5nKGQsZCsyKSE9XCIwM1wiKXtyZXR1cm4gLTF9dmFyIGM9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGQpO2lmKGYuc3Vic3RyaW5nKGMsYysyKSE9XCIwMFwiKXtyZXR1cm4gLTF9cmV0dXJuIGMrMn07WDUwOS5nZXRTdWJqZWN0UHVibGljS2V5SW5mb1Bvc0Zyb21DZXJ0SGV4PWZ1bmN0aW9uKGQpe3ZhciBjPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZCwwKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGMpO2lmKGIubGVuZ3RoPDEpe3JldHVybiAtMX1pZihkLnN1YnN0cmluZyhiWzBdLGJbMF0rMTApPT1cImEwMDMwMjAxMDJcIil7aWYoYi5sZW5ndGg8Nil7cmV0dXJuIC0xfXJldHVybiBiWzZdfWVsc2V7aWYoYi5sZW5ndGg8NSl7cmV0dXJuIC0xfXJldHVybiBiWzVdfX07WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4PWZ1bmN0aW9uKGYpe3ZhciBlPVg1MDkuZ2V0U3ViamVjdFB1YmxpY0tleVBvc0Zyb21DZXJ0SGV4KGYpO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZSk7aWYoYi5sZW5ndGghPTIpe3JldHVybltdfXZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYlswXSk7dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixiWzFdKTtpZihkIT1udWxsJiZjIT1udWxsKXtyZXR1cm5bZCxjXX1lbHNle3JldHVybltdfX07WDUwOS5nZXRIZXhUYnNDZXJ0aWZpY2F0ZUZyb21DZXJ0PWZ1bmN0aW9uKGIpe3ZhciBhPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooYiwwKTtyZXR1cm4gYX07WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0UEVNPWZ1bmN0aW9uKGMpe3ZhciBkPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGQpO3JldHVybiBifTtYNTA5LmhleDJkbj1mdW5jdGlvbihlKXt2YXIgZj1cIlwiO3ZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsMCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBiPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZSxjW2RdKTtmPWYrXCIvXCIrWDUwOS5oZXgycmRuKGIpfXJldHVybiBmfTtYNTA5LmhleDJyZG49ZnVuY3Rpb24oYSl7dmFyIGY9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QoYSwwLFswLDBdKTt2YXIgZT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYSwwLFswLDFdKTt2YXIgYz1cIlwiO3RyeXtjPVg1MDkuRE5fQVRUUkhFWFtmXX1jYXRjaChiKXtjPWZ9ZT1lLnJlcGxhY2UoLyguLikvZyxcIiUkMVwiKTt2YXIgZD1kZWNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIGMrXCI9XCIrZH07WDUwOS5ETl9BVFRSSEVYPXtcIjA2MDM1NTA0MDZcIjpcIkNcIixcIjA2MDM1NTA0MGFcIjpcIk9cIixcIjA2MDM1NTA0MGJcIjpcIk9VXCIsXCIwNjAzNTUwNDAzXCI6XCJDTlwiLFwiMDYwMzU1MDQwNVwiOlwiU05cIixcIjA2MDM1NTA0MDhcIjpcIlNUXCIsXCIwNjAzNTUwNDA3XCI6XCJMXCIsfTtYNTA5LmdldFB1YmxpY0tleUZyb21DZXJ0UEVNPWZ1bmN0aW9uKGYpe3ZhciBjPVg1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU0oZik7aWYoYy5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciBpPUtFWVVUSUwucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgoYy5rZXloZXgpO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnNldFB1YmxpYyhpLm4saS5lKTtyZXR1cm4gan1lbHNle2lmKGMuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe3ZhciBlPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjLmFsZ3BhcmFtXTt2YXIgaj1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmUsaW5mbzpjLmtleWhleH0pO2ouc2V0UHVibGljS2V5SGV4KGMua2V5aGV4KTtyZXR1cm4gan1lbHNle2lmKGMuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciBiPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzBdLFwiMDJcIik7dmFyIGE9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMV0sXCIwMlwiKTt2YXIgZD1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFsyXSxcIjAyXCIpO3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMua2V5aGV4LDApO2g9aC5zdWJzdHIoMik7dmFyIGo9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO2ouc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKGIsMTYpLG5ldyBCaWdJbnRlZ2VyKGEsMTYpLG5ldyBCaWdJbnRlZ2VyKGQsMTYpLG5ldyBCaWdJbnRlZ2VyKGgsMTYpKTtyZXR1cm4gan1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBrZXlcIn19fX07WDUwOS5nZXRQdWJsaWNLZXlJbmZvUHJvcE9mQ2VydFBFTT1mdW5jdGlvbihlKXt2YXIgYz17fTtjLmFsZ3BhcmFtPW51bGw7dmFyIGc9WDUwOS5wZW1Ub0hleChlKTt2YXIgZD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLDApO2lmKGQubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDEpXCJ9aWYoZy5zdWJzdHIoZFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDIpXCJ9dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxkWzBdKTtpZihiLmxlbmd0aDw3KXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxiWzZdKTtpZihoLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA0KVwifXZhciBmPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaFswXSk7aWYoZi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNSlcIn1jLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGZbMF0pO2lmKGcuc3Vic3RyKGZbMV0sMik9PVwiMDZcIil7Yy5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGZbMV0pfWVsc2V7aWYoZy5zdWJzdHIoZlsxXSwyKT09XCIzMFwiKXtjLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZyxmWzFdKX19aWYoZy5zdWJzdHIoaFsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxoWzFdKTtjLmtleWhleD1hLnN1YnN0cigyKTtyZXR1cm4gY307WDUwOS5nZXRQdWJsaWNLZXlJbmZvUG9zT2ZDZXJ0SEVYPWZ1bmN0aW9uKGMpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihjLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLGJbMF0pO2lmKGEubGVuZ3RoPDcpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1yZXR1cm4gYVs2XX07WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4PWZ1bmN0aW9uKGcpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihnLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGJbMF0pO2lmKGEubGVuZ3RoPDgpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1pZihnLnN1YnN0cihhWzddLDIpIT1cImEzXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNClcIn12YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGFbN10pO2lmKGgubGVuZ3RoIT0xKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDUpXCJ9aWYoZy5zdWJzdHIoaFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGY9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxoWzBdKTt2YXIgZT1mLmxlbmd0aDt2YXIgZD1uZXcgQXJyYXkoZSk7Zm9yKHZhciBjPTA7YzxlO2MrKyl7ZFtjXT1YNTA5LmdldFYzRXh0SXRlbUluZm9fQXRPYmooZyxmW2NdKX1yZXR1cm4gZH07WDUwOS5nZXRWM0V4dEl0ZW1JbmZvX0F0T2JqPWZ1bmN0aW9uKGYsZyl7dmFyIGU9e307ZS5wb3NUTFY9Zzt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGcpO2lmKGIubGVuZ3RoIT0yJiZiLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDEpXCJ9aWYoZi5zdWJzdHIoYlswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMilcIn12YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMF0pO2Uub2lkPUFTTjFIRVguaGV4dG9vaWRzdHIoZCk7ZS5jcml0aWNhbD1mYWxzZTtpZihiLmxlbmd0aD09Myl7ZS5jcml0aWNhbD10cnVlfXZhciBjPWJbYi5sZW5ndGgtMV07aWYoZi5zdWJzdHIoYywyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMylcIn1lLnBvc1Y9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGMpO3JldHVybiBlfTtYNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oYixhKXt2YXIgYz1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoYixhKTtpZihjPT0tMSl7cmV0dXJuIG51bGx9cmV0dXJuIEFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooYixjKX07WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZT1mdW5jdGlvbihiLGEpe3ZhciBjPVg1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZShiLGEpO2lmKGM9PS0xKXtyZXR1cm4gbnVsbH1yZXR1cm4gQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYixjKX07WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGYsYil7dmFyIGQ9YjtpZighYi5tYXRjaCgvXlswLTkuXSskLykpe2Q9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkKGIpfWlmKGQ9PVwiXCIpe3JldHVybiAtMX12YXIgYz1YNTA5LmdldFYzRXh0SW5mb0xpc3RPZkNlcnRIZXgoZik7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDthKyspe3ZhciBlPWNbYV07aWYoZS5vaWQ9PWQpe3JldHVybiBlLnBvc1Z9fXJldHVybiAtMX07WDUwOS5nZXRFeHRCYXNpY0NvbnN0cmFpbnRzPWZ1bmN0aW9uKGQpe3ZhciBhPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoZCxcImJhc2ljQ29uc3RyYWludHNcIik7aWYoYT09PW51bGwpe3JldHVybiBudWxsfWlmKGE9PT1cIlwiKXtyZXR1cm57fX1pZihhPT09XCIwMTAxZmZcIil7cmV0dXJue2NBOnRydWV9fWlmKGEuc3Vic3RyKDAsOCk9PT1cIjAxMDFmZjAyXCIpe3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGEsNik7dmFyIGI9cGFyc2VJbnQoYywxNik7cmV0dXJue2NBOnRydWUscGF0aExlbjpifX10aHJvd1widW5rbm93biBlcnJvclwifTtYNTA5LktFWVVTQUdFX05BTUU9W1wiZGlnaXRhbFNpZ25hdHVyZVwiLFwibm9uUmVwdWRpYXRpb25cIixcImtleUVuY2lwaGVybWVudFwiLFwiZGF0YUVuY2lwaGVybWVudFwiLFwia2V5QWdyZWVtZW50XCIsXCJrZXlDZXJ0U2lnblwiLFwiY1JMU2lnblwiLFwiZW5jaXBoZXJPbmx5XCIsXCJkZWNpcGhlck9ubHlcIl07WDUwOS5nZXRFeHRLZXlVc2FnZUJpbj1mdW5jdGlvbihkKXt2YXIgYj1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGQsXCJrZXlVc2FnZVwiKTtpZihiPT1cIlwiKXtyZXR1cm5cIlwifWlmKGIubGVuZ3RoJTIhPTB8fGIubGVuZ3RoPD0yKXt0aHJvd1wibWFsZm9ybWVkIGtleSB1c2FnZSB2YWx1ZVwifXZhciBhPXBhcnNlSW50KGIuc3Vic3RyKDAsMikpO3ZhciBjPXBhcnNlSW50KGIuc3Vic3RyKDIpLDE2KS50b1N0cmluZygyKTtyZXR1cm4gYy5zdWJzdHIoMCxjLmxlbmd0aC1hKX07WDUwOS5nZXRFeHRLZXlVc2FnZVN0cmluZz1mdW5jdGlvbihlKXt2YXIgZD1YNTA5LmdldEV4dEtleVVzYWdlQmluKGUpO3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtpZihkLnN1YnN0cihjLDEpPT1cIjFcIil7Yi5wdXNoKFg1MDkuS0VZVVNBR0VfTkFNRVtjXSl9fXJldHVybiBiLmpvaW4oXCIsXCIpfTtYNTA5LmdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKGIpe3ZhciBhPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoYixcInN1YmplY3RLZXlJZGVudGlmaWVyXCIpO3JldHVybiBhfTtYNTA5LmdldEV4dEF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oZil7dmFyIGI9e307dmFyIGU9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGYsXCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpO2lmKGU9PT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtpZihlLnN1YnN0cihjW2RdLDIpPT09XCI4MFwiKXtiLmtpZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGNbZF0pfX1yZXR1cm4gYn07WDUwOS5nZXRFeHRFeHRLZXlVc2FnZU5hbWU9ZnVuY3Rpb24oayl7dmFyIGI9bmV3IEFycmF5KCk7dmFyIGY9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGssXCJleHRLZXlVc2FnZVwiKTtpZihmPT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZiwwKTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGo9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixjW2VdKTt2YXIgZz1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQoaik7dmFyIGQ9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGcpO2IucHVzaChkKX1yZXR1cm4gYn07WDUwOS5nZXRFeHRTdWJqZWN0QWx0TmFtZT1mdW5jdGlvbihnKXt2YXIgYj1uZXcgQXJyYXkoKTt2YXIgZj1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUoZyxcInN1YmplY3RBbHROYW1lXCIpO3ZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe2lmKGYuc3Vic3RyKGNbZV0sMik9PT1cIjgyXCIpe3ZhciBkPWhleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGNbZV0pKTtiLnB1c2goZCl9fXJldHVybiBifTtYNTA5LmdldEV4dENSTERpc3RyaWJ1dGlvblBvaW50c1VSST1mdW5jdGlvbihuKXt2YXIgcD1uZXcgQXJyYXkoKTt2YXIgaz1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUobixcImNSTERpc3RyaWJ1dGlvblBvaW50c1wiKTt2YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihrLDApO2Zvcih2YXIgZz0wO2c8by5sZW5ndGg7ZysrKXt2YXIgbD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGssb1tnXSk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobCwwKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl7aWYobC5zdWJzdHIoYltlXSwyKT09PVwiYTBcIil7dmFyIGY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobCxiW2VdKTtpZihmLnN1YnN0cigwLDIpPT09XCJhMFwiKXt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLDApO2lmKGMuc3Vic3RyKDAsMik9PT1cIjg2XCIpe3ZhciBtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsMCk7dmFyIGQ9aGV4dG91dGY4KG0pO3AucHVzaChkKX19fX19cmV0dXJuIHB9O1g1MDkuZ2V0RXh0QUlBSW5mbz1mdW5jdGlvbihnKXt2YXIgaj17fTtqLm9jc3A9W107ai5jYWlzc3Vlcj1bXTt2YXIgaD1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoZyxcImF1dGhvcml0eUluZm9BY2Nlc3NcIik7aWYoaD09LTEpe3JldHVybiBudWxsfWlmKGcuc3Vic3RyKGgsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBBSUEgRXh0biBWYWx1ZVwifXZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBhPWRbY107dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxhKTtpZihiLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBBY2Nlc3NEZXNjcmlwdGlvbiBvZiBBSUEgRXh0blwifXZhciBlPWJbMF07dmFyIGY9YlsxXTtpZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDFcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLm9jc3AucHVzaChoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxmKSkpfX1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDJcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLmNhaXNzdWVyLnB1c2goaGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZikpKX19fXJldHVybiBqfTtYNTA5LmdldFNpZ25hdHVyZUFsZ29yaXRobU5hbWU9ZnVuY3Rpb24oZCl7dmFyIGI9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGQsMCxbMSwwXSk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBjPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTtyZXR1cm4gY307WDUwOS5nZXRTaWduYXR1cmVWYWx1ZUhleD1mdW5jdGlvbihiKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYiwwLFsyXSk7aWYoYS5zdWJzdHIoMCwyKSE9PVwiMDBcIil7dGhyb3dcImNhbid0IGdldCBzaWduYXR1cmUgdmFsdWVcIn1yZXR1cm4gYS5zdWJzdHIoMil9O1g1MDkuZ2V0U2VyaWFsTnVtYmVySGV4PWZ1bmN0aW9uKGEpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYSwwLFswLDFdKX07XG4vKiEgandzLTMuMy4zIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1M9ZnVuY3Rpb24oKXt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5wYXJzZUpXUz1mdW5jdGlvbihlLGcpe2lmKCh0aGlzLnBhcnNlZEpXUyE9PXVuZGVmaW5lZCkmJihnfHwodGhpcy5wYXJzZWRKV1Muc2lndmFsSCE9PXVuZGVmaW5lZCkpKXtyZXR1cm59aWYoZS5tYXRjaCgvXihbXi5dKylcXC4oW14uXSspXFwuKFteLl0rKSQvKT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn12YXIgaD1SZWdFeHAuJDE7dmFyIGM9UmVnRXhwLiQyO3ZhciBpPVJlZ0V4cC4kMzt2YXIgaz1oK1wiLlwiK2M7dGhpcy5wYXJzZWRKV1M9e307dGhpcy5wYXJzZWRKV1MuaGVhZEI2NFU9aDt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkQjY0VT1jO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEI2NFU9aTt0aGlzLnBhcnNlZEpXUy5zaT1rO2lmKCFnKXt2YXIgZj1iNjR1dG9oZXgoaSk7dmFyIGQ9cGFyc2VCaWdJbnQoZiwxNik7dGhpcy5wYXJzZWRKV1Muc2lndmFsSD1mO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEJJPWR9dmFyIGI9YjY0dXRvdXRmOChoKTt2YXIgaj1iNjR1dG91dGY4KGMpO3RoaXMucGFyc2VkSldTLmhlYWRTPWI7dGhpcy5wYXJzZWRKV1MucGF5bG9hZFM9ajtpZighYS5pc1NhZmVKU09OU3RyaW5nKGIsdGhpcy5wYXJzZWRKV1MsXCJoZWFkUFwiKSl7dGhyb3dcIm1hbGZvcm1lZCBKU09OIHN0cmluZyBmb3IgSldTIEhlYWQ6IFwiK2J9fX07S0pVUi5qd3MuSldTLnNpZ249ZnVuY3Rpb24oYSxpLGMsbSxsKXt2YXIgaz1LSlVSLmp3cy5KV1M7dmFyIHEsZSxqO2lmKHR5cGVvZiBpIT1cInN0cmluZ1wiJiZ0eXBlb2YgaSE9XCJvYmplY3RcIil7dGhyb3dcInNwSGVhZGVyIG11c3QgYmUgSlNPTiBzdHJpbmcgb3Igb2JqZWN0OiBcIitpfWlmKHR5cGVvZiBpPT1cIm9iamVjdFwiKXtlPWk7cT1KU09OLnN0cmluZ2lmeShlKX1pZih0eXBlb2YgaT09XCJzdHJpbmdcIil7cT1pO2lmKCFrLmlzU2FmZUpTT05TdHJpbmcocSkpe3Rocm93XCJKV1MgSGVhZCBpcyBub3Qgc2FmZSBKU09OIHN0cmluZzogXCIrcX1lPWsucmVhZFNhZmVKU09OU3RyaW5nKHEpfWo9YztpZih0eXBlb2YgYz09XCJvYmplY3RcIil7aj1KU09OLnN0cmluZ2lmeShjKX1pZigoYT09XCJcInx8YT09bnVsbCkmJmUuYWxnIT09dW5kZWZpbmVkKXthPWUuYWxnfWlmKChhIT1cIlwiJiZhIT1udWxsKSYmZS5hbGc9PT11bmRlZmluZWQpe2UuYWxnPWE7cT1KU09OLnN0cmluZ2lmeShlKX1pZihhIT09ZS5hbGcpe3Rocm93XCJhbGcgYW5kIHNIZWFkZXIuYWxnIGRvZXNuJ3QgbWF0Y2g6IFwiK2ErXCIhPVwiK2UuYWxnfXZhciBkPW51bGw7aWYoay5qd3NhbGcyc2lnYWxnW2FdPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2F9ZWxzZXtkPWsuandzYWxnMnNpZ2FsZ1thXX12YXIgYj11dGY4dG9iNjR1KHEpO3ZhciBnPXV0Zjh0b2I2NHUoaik7dmFyIG89YitcIi5cIitnO3ZhciBuPVwiXCI7aWYoZC5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe2lmKG09PT11bmRlZmluZWQpe3Rocm93XCJtYWMga2V5IHNoYWxsIGJlIHNwZWNpZmllZCBmb3IgSFMqIGFsZ1wifXZhciBoPW5ldyBLSlVSLmNyeXB0by5NYWMoe2FsZzpkLHByb3Y6XCJjcnlwdG9qc1wiLHBhc3M6bX0pO2gudXBkYXRlU3RyaW5nKG8pO249aC5kb0ZpbmFsKCl9ZWxzZXtpZihkLmluZGV4T2YoXCJ3aXRoRUNEU0FcIikhPS0xKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO2hBU04xU2lnPXAuc2lnbigpO249S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnKGhBU04xU2lnKX1lbHNle2lmKGQhPVwibm9uZVwiKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO249cC5zaWduKCl9fX12YXIgZj1oZXh0b2I2NHUobik7cmV0dXJuIG8rXCIuXCIrZn07S0pVUi5qd3MuSldTLnZlcmlmeT1mdW5jdGlvbihwLHQsail7dmFyIG09S0pVUi5qd3MuSldTO3ZhciBxPXAuc3BsaXQoXCIuXCIpO3ZhciBkPXFbMF07dmFyIGw9cVsxXTt2YXIgYj1kK1wiLlwiK2w7dmFyIHI9YjY0dXRvaGV4KHFbMl0pO3ZhciBpPW0ucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgocVswXSkpO3ZhciBoPW51bGw7dmFyIHM9bnVsbDtpZihpLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkIGluIGhlYWRlclwifWVsc2V7aD1pLmFsZztzPWguc3Vic3RyKDAsMil9aWYoaiE9bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGopPT09XCJbb2JqZWN0IEFycmF5XVwiJiZqLmxlbmd0aD4wKXt2YXIgYz1cIjpcIitqLmpvaW4oXCI6XCIpK1wiOlwiO2lmKGMuaW5kZXhPZihcIjpcIitoK1wiOlwiKT09LTEpe3Rocm93XCJhbGdvcml0aG0gJ1wiK2grXCInIG5vdCBhY2NlcHRlZCBpbiB0aGUgbGlzdFwifX1pZihoIT1cIm5vbmVcIiYmdD09PW51bGwpe3Rocm93XCJrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIHRvIHZlcmlmeS5cIn1pZih0eXBlb2YgdD09XCJzdHJpbmdcIiYmdC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0PUtFWVVUSUwuZ2V0S2V5KHQpfWlmKHM9PVwiUlNcInx8cz09XCJQU1wiKXtpZighKHQgaW5zdGFuY2VvZiBSU0FLZXkpKXt0aHJvd1wia2V5IHNoYWxsIGJlIGEgUlNBS2V5IG9iaiBmb3IgUlMqIGFuZCBQUyogYWxnc1wifX1pZihzPT1cIkVTXCIpe2lmKCEodCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIEVDRFNBIG9iaiBmb3IgRVMqIGFsZ3NcIn19aWYoaD09XCJub25lXCIpe312YXIgbj1udWxsO2lmKG0uandzYWxnMnNpZ2FsZ1tpLmFsZ109PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGcgbmFtZTogXCIraH1lbHNle249bS5qd3NhbGcyc2lnYWxnW2hdfWlmKG49PVwibm9uZVwiKXt0aHJvd1wibm90IHN1cHBvcnRlZFwifWVsc2V7aWYobi5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe3ZhciBrPW51bGw7aWYodD09PXVuZGVmaW5lZCl7dGhyb3dcImhleGFkZWNpbWFsIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhNQUNcIn12YXIgZz1uZXcgS0pVUi5jcnlwdG8uTWFjKHthbGc6bixwYXNzOnR9KTtnLnVwZGF0ZVN0cmluZyhiKTtrPWcuZG9GaW5hbCgpO3JldHVybiByPT1rfWVsc2V7aWYobi5pbmRleE9mKFwid2l0aEVDRFNBXCIpIT0tMSl7dmFyIGY9bnVsbDt0cnl7Zj1LSlVSLmNyeXB0by5FQ0RTQS5jb25jYXRTaWdUb0FTTjFTaWcocil9Y2F0Y2gobyl7cmV0dXJuIGZhbHNlfXZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShmKX1lbHNle3ZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShyKX19fX07S0pVUi5qd3MuSldTLnBhcnNlPWZ1bmN0aW9uKGcpe3ZhciBjPWcuc3BsaXQoXCIuXCIpO3ZhciBiPXt9O3ZhciBmLGUsZDtpZihjLmxlbmd0aCE9MiYmYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgc0pXUzogd3JvbmcgbnVtYmVyIG9mICcuJyBzcGxpdHRlZCBlbGVtZW50c1wifWY9Y1swXTtlPWNbMV07aWYoYy5sZW5ndGg9PTMpe2Q9Y1syXX1iLmhlYWRlck9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZikpO2IucGF5bG9hZE9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZSkpO2IuaGVhZGVyUFA9SlNPTi5zdHJpbmdpZnkoYi5oZWFkZXJPYmosbnVsbCxcIiAgXCIpO2lmKGIucGF5bG9hZE9iaj09bnVsbCl7Yi5wYXlsb2FkUFA9YjY0dXRvdXRmOChlKX1lbHNle2IucGF5bG9hZFBQPUpTT04uc3RyaW5naWZ5KGIucGF5bG9hZE9iaixudWxsLFwiICBcIil9aWYoZCE9PXVuZGVmaW5lZCl7Yi5zaWdIZXg9YjY0dXRvaGV4KGQpfXJldHVybiBifTtLSlVSLmp3cy5KV1MudmVyaWZ5SldUPWZ1bmN0aW9uKGQsaixsKXt2YXIgaD1LSlVSLmp3cy5KV1M7dmFyIGk9ZC5zcGxpdChcIi5cIik7dmFyIGM9aVswXTt2YXIgZz1pWzFdO3ZhciBtPWMrXCIuXCIrZzt2YXIgaz1iNjR1dG9oZXgoaVsyXSk7dmFyIGY9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChjKSk7dmFyIGU9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChnKSk7aWYoZi5hbGc9PT11bmRlZmluZWQpe3JldHVybiBmYWxzZX1pZihsLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFjY2VwdEZpZWxkLmFsZyBzaGFsbCBiZSBzcGVjaWZpZWRcIn1pZighaC5pbkFycmF5KGYuYWxnLGwuYWxnKSl7cmV0dXJuIGZhbHNlfWlmKGUuaXNzIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5pc3M9PT1cIm9iamVjdFwiKXtpZighaC5pbkFycmF5KGUuaXNzLGwuaXNzKSl7cmV0dXJuIGZhbHNlfX1pZihlLnN1YiE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuc3ViPT09XCJvYmplY3RcIil7aWYoIWguaW5BcnJheShlLnN1YixsLnN1Yikpe3JldHVybiBmYWxzZX19aWYoZS5hdWQhPT11bmRlZmluZWQmJnR5cGVvZiBsLmF1ZD09PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBlLmF1ZD09XCJzdHJpbmdcIil7aWYoIWguaW5BcnJheShlLmF1ZCxsLmF1ZCkpe3JldHVybiBmYWxzZX19ZWxzZXtpZih0eXBlb2YgZS5hdWQ9PVwib2JqZWN0XCIpe2lmKCFoLmluY2x1ZGVkQXJyYXkoZS5hdWQsbC5hdWQpKXtyZXR1cm4gZmFsc2V9fX19dmFyIGI9S0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKTtpZihsLnZlcmlmeUF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgbC52ZXJpZnlBdD09XCJudW1iZXJcIil7Yj1sLnZlcmlmeUF0fWlmKGUuZXhwIT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5leHA9PVwibnVtYmVyXCIpe2lmKGUuZXhwPGIpe3JldHVybiBmYWxzZX19aWYoZS5uYmYhPT11bmRlZmluZWQmJnR5cGVvZiBlLm5iZj09XCJudW1iZXJcIil7aWYoYjxlLm5iZil7cmV0dXJuIGZhbHNlfX1pZihlLmlhdCE9PXVuZGVmaW5lZCYmdHlwZW9mIGUuaWF0PT1cIm51bWJlclwiKXtpZihiPGUuaWF0KXtyZXR1cm4gZmFsc2V9fWlmKGUuanRpIT09dW5kZWZpbmVkJiZsLmp0aSE9PXVuZGVmaW5lZCl7aWYoZS5qdGkhPT1sLmp0aSl7cmV0dXJuIGZhbHNlfX1pZighS0pVUi5qd3MuSldTLnZlcmlmeShkLGosbC5hbGcpKXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9O0tKVVIuandzLkpXUy5pbmNsdWRlZEFycmF5PWZ1bmN0aW9uKGIsYSl7dmFyIGQ9S0pVUi5qd3MuSldTLmluQXJyYXk7aWYoYj09PW51bGwpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYiE9PVwib2JqZWN0XCIpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYi5sZW5ndGghPT1cIm51bWJlclwiKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2lmKCFkKGJbY10sYSkpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O0tKVVIuandzLkpXUy5pbkFycmF5PWZ1bmN0aW9uKGQsYil7aWYoYj09PW51bGwpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYiE9PVwib2JqZWN0XCIpe3JldHVybiBmYWxzZX1pZih0eXBlb2YgYi5sZW5ndGghPT1cIm51bWJlclwiKXtyZXR1cm4gZmFsc2V9Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe2lmKGJbY109PWQpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9O0tKVVIuandzLkpXUy5qd3NhbGcyc2lnYWxnPXtIUzI1NjpcIkhtYWNTSEEyNTZcIixIUzM4NDpcIkhtYWNTSEEzODRcIixIUzUxMjpcIkhtYWNTSEE1MTJcIixSUzI1NjpcIlNIQTI1NndpdGhSU0FcIixSUzM4NDpcIlNIQTM4NHdpdGhSU0FcIixSUzUxMjpcIlNIQTUxMndpdGhSU0FcIixFUzI1NjpcIlNIQTI1NndpdGhFQ0RTQVwiLEVTMzg0OlwiU0hBMzg0d2l0aEVDRFNBXCIsUFMyNTY6XCJTSEEyNTZ3aXRoUlNBYW5kTUdGMVwiLFBTMzg0OlwiU0hBMzg0d2l0aFJTQWFuZE1HRjFcIixQUzUxMjpcIlNIQTUxMndpdGhSU0FhbmRNR0YxXCIsbm9uZTpcIm5vbmVcIix9O0tKVVIuandzLkpXUy5pc1NhZmVKU09OU3RyaW5nPWZ1bmN0aW9uKGMsYixkKXt2YXIgZT1udWxsO3RyeXtlPWpzb25QYXJzZShjKTtpZih0eXBlb2YgZSE9XCJvYmplY3RcIil7cmV0dXJuIDB9aWYoZS5jb25zdHJ1Y3Rvcj09PUFycmF5KXtyZXR1cm4gMH1pZihiKXtiW2RdPWV9cmV0dXJuIDF9Y2F0Y2goYSl7cmV0dXJuIDB9fTtLSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nPWZ1bmN0aW9uKGIpe3ZhciBjPW51bGw7dHJ5e2M9anNvblBhcnNlKGIpO2lmKHR5cGVvZiBjIT1cIm9iamVjdFwiKXtyZXR1cm4gbnVsbH1pZihjLmNvbnN0cnVjdG9yPT09QXJyYXkpe3JldHVybiBudWxsfXJldHVybiBjfWNhdGNoKGEpe3JldHVybiBudWxsfX07S0pVUi5qd3MuSldTLmdldEVuY29kZWRTaWduYXR1cmVWYWx1ZUZyb21KV1M9ZnVuY3Rpb24oYSl7aWYoYS5tYXRjaCgvXlteLl0rXFwuW14uXStcXC4oW14uXSspJC8pPT1udWxsKXt0aHJvd1wiSldTIHNpZ25hdHVyZSBpcyBub3QgYSBmb3JtIG9mICdIZWFkLlBheWxvYWQuU2lnVmFsdWUnLlwifXJldHVybiBSZWdFeHAuJDF9O0tKVVIuandzLkpXUy5nZXRKV0t0aHVtYnByaW50PWZ1bmN0aW9uKGQpe2lmKGQua3R5IT09XCJSU0FcIiYmZC5rdHkhPT1cIkVDXCImJmQua3R5IT09XCJvY3RcIil7dGhyb3dcInVuc3VwcG9ydGVkIGFsZ29yaXRobSBmb3IgSldLIFRodW1wcmludFwifXZhciBhPVwie1wiO2lmKGQua3R5PT09XCJSU0FcIil7aWYodHlwZW9mIGQubiE9XCJzdHJpbmdcInx8dHlwZW9mIGQuZSE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIG4gYW5kIGUgdmFsdWUgZm9yIFJTQSBrZXlcIn1hKz0nXCJlXCI6XCInK2QuZSsnXCIsJzthKz0nXCJrdHlcIjpcIicrZC5rdHkrJ1wiLCc7YSs9J1wiblwiOlwiJytkLm4rJ1wifSd9ZWxzZXtpZihkLmt0eT09PVwiRUNcIil7aWYodHlwZW9mIGQuY3J2IT1cInN0cmluZ1wifHx0eXBlb2YgZC54IT1cInN0cmluZ1wifHx0eXBlb2YgZC55IT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgY3J2LCB4IGFuZCB5IHZhbHVlIGZvciBFQyBrZXlcIn1hKz0nXCJjcnZcIjpcIicrZC5jcnYrJ1wiLCc7YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcInhcIjpcIicrZC54KydcIiwnO2ErPSdcInlcIjpcIicrZC55KydcIn0nfWVsc2V7aWYoZC5rdHk9PT1cIm9jdFwiKXtpZih0eXBlb2YgZC5rIT1cInN0cmluZ1wiKXt0aHJvd1wid3JvbmcgayB2YWx1ZSBmb3Igb2N0KHN5bW1ldHJpYykga2V5XCJ9YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcImtcIjpcIicrZC5rKydcIn0nfX19dmFyIGI9cnN0cnRvaGV4KGEpO3ZhciBjPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChiLFwic2hhMjU2XCIpO3ZhciBlPWhleHRvYjY0dShjKTtyZXR1cm4gZX07S0pVUi5qd3MuSW50RGF0ZT17fTtLSlVSLmp3cy5JbnREYXRlLmdldD1mdW5jdGlvbihhKXtpZihhPT1cIm5vd1wiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKX1lbHNle2lmKGE9PVwibm93ICsgMWhvdXJcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjB9ZWxzZXtpZihhPT1cIm5vdyArIDFkYXlcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjR9ZWxzZXtpZihhPT1cIm5vdyArIDFtb250aFwiKXtyZXR1cm4gS0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKSs2MCo2MCoyNCozMH1lbHNle2lmKGE9PVwibm93ICsgMXllYXJcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjQqMzY1fWVsc2V7aWYoYS5tYXRjaCgvWiQvKSl7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0WnVsdShhKX1lbHNle2lmKGEubWF0Y2goL15bMC05XSskLykpe3JldHVybiBwYXJzZUludChhKX19fX19fX10aHJvd1widW5zdXBwb3J0ZWQgZm9ybWF0OiBcIithfTtLSlVSLmp3cy5JbnREYXRlLmdldFp1bHU9ZnVuY3Rpb24obCl7dmFyIGs7aWYoaz1sLm1hdGNoKC8oXFxkKykoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpWi8pKXt2YXIgYj1SZWdFeHAuJDE7dmFyIGk9cGFyc2VJbnQoYik7aWYoYi5sZW5ndGg9PTQpe31lbHNle2lmKGIubGVuZ3RoPT0yKXtpZig1MDw9aSYmaTwxMDApe2k9MTkwMCtpfWVsc2V7aWYoMDw9aSYmaTw1MCl7aT0yMDAwK2l9ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHllYXIgc3RyaW5nIGZvciBVVENUaW1lXCJ9fX1lbHNle3Rocm93XCJtYWxmb3JtZWQgeWVhciBzdHJpbmdcIn19dmFyIGc9cGFyc2VJbnQoUmVnRXhwLiQyKS0xO3ZhciBqPXBhcnNlSW50KFJlZ0V4cC4kMyk7dmFyIGM9cGFyc2VJbnQoUmVnRXhwLiQ0KTt2YXIgZT1wYXJzZUludChSZWdFeHAuJDUpO3ZhciBmPXBhcnNlSW50KFJlZ0V4cC4kNik7dmFyIGg9bmV3IERhdGUoRGF0ZS5VVEMoaSxnLGosYyxlLGYpKTtyZXR1cm4gfn4oaC8xMDAwKX10aHJvd1widW5zdXBwb3J0ZWQgZm9ybWF0OiBcIitsfTtLSlVSLmp3cy5JbnREYXRlLmdldE5vdz1mdW5jdGlvbigpe3ZhciBhPX5+KG5ldyBEYXRlKCkvMTAwMCk7cmV0dXJuIGF9O0tKVVIuandzLkludERhdGUuaW50RGF0ZTJVVENTdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IERhdGUoYSoxMDAwKTtyZXR1cm4gYi50b1VUQ1N0cmluZygpfTtLSlVSLmp3cy5JbnREYXRlLmludERhdGUyWnVsdT1mdW5jdGlvbihlKXt2YXIgaT1uZXcgRGF0ZShlKjEwMDApO3ZhciBoPShcIjAwMDBcIitpLmdldFVUQ0Z1bGxZZWFyKCkpLnNsaWNlKC00KTt2YXIgZz0oXCIwMFwiKyhpLmdldFVUQ01vbnRoKCkrMSkpLnNsaWNlKC0yKTt2YXIgYj0oXCIwMFwiK2kuZ2V0VVRDRGF0ZSgpKS5zbGljZSgtMik7dmFyIGE9KFwiMDBcIitpLmdldFVUQ0hvdXJzKCkpLnNsaWNlKC0yKTt2YXIgYz0oXCIwMFwiK2kuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMik7dmFyIGY9KFwiMDBcIitpLmdldFVUQ1NlY29uZHMoKSkuc2xpY2UoLTIpO3JldHVybiBoK2crYithK2MrZitcIlpcIn07XG4vKiEgandzanMtMi4wLjEgKGMpIDIwMTAtMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc2p3cy9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5qd3M9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmp3cyl7S0pVUi5qd3M9e319S0pVUi5qd3MuSldTSlM9ZnVuY3Rpb24oKXt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5hSGVhZGVyPVtdO3RoaXMuc1BheWxvYWQ9XCJcIjt0aGlzLmFTaWduYXR1cmU9W107dGhpcy5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hSGVhZGVyPVtdO3RoaXMuc1BheWxvYWQ9XCJcIjt0aGlzLmFTaWduYXR1cmU9W119O3RoaXMuaW5pdFdpdGhKV1M9ZnVuY3Rpb24oYyl7dGhpcy5pbml0KCk7dmFyIGI9bmV3IEtKVVIuandzLkpXUygpO2IucGFyc2VKV1MoYyk7dGhpcy5hSGVhZGVyLnB1c2goYi5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuc1BheWxvYWQ9Yi5wYXJzZWRKV1MucGF5bG9hZEI2NFU7dGhpcy5hU2lnbmF0dXJlLnB1c2goYi5wYXJzZWRKV1Muc2lndmFsQjY0VSl9O3RoaXMuYWRkU2lnbmF0dXJlQnlIZWFkZXJLZXk9ZnVuY3Rpb24oZSxiKXt2YXIgZD1iNjR1dG91dGY4KHRoaXMuc1BheWxvYWQpO3ZhciBjPW5ldyBLSlVSLmp3cy5KV1MoKTt2YXIgZj1jLmdlbmVyYXRlSldTQnlQMVBydktleShlLGQsYik7dGhpcy5hSGVhZGVyLnB1c2goYy5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGMucGFyc2VkSldTLnNpZ3ZhbEI2NFUpfTt0aGlzLmFkZFNpZ25hdHVyZUJ5SGVhZGVyUGF5bG9hZEtleT1mdW5jdGlvbihlLGQsYil7dmFyIGM9bmV3IEtKVVIuandzLkpXUygpO3ZhciBmPWMuZ2VuZXJhdGVKV1NCeVAxUHJ2S2V5KGUsZCxiKTt0aGlzLmFIZWFkZXIucHVzaChjLnBhcnNlZEpXUy5oZWFkQjY0VSk7dGhpcy5zUGF5bG9hZD1jLnBhcnNlZEpXUy5wYXlsb2FkQjY0VTt0aGlzLmFTaWduYXR1cmUucHVzaChjLnBhcnNlZEpXUy5zaWd2YWxCNjRVKX07dGhpcy52ZXJpZnlXaXRoQ2VydHM9ZnVuY3Rpb24oYyl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aCE9Yy5sZW5ndGgpe3Rocm93XCJudW0gaGVhZGVycyBkb2VzIG5vdCBtYXRjaCB3aXRoIG51bSBjZXJ0c1wifWlmKHRoaXMuYVNpZ25hdHVyZS5sZW5ndGghPWMubGVuZ3RoKXt0aHJvd1wibnVtIHNpZ25hdHVyZXMgZG9lcyBub3QgbWF0Y2ggd2l0aCBudW0gY2VydHNcIn12YXIgaz10aGlzLnNQYXlsb2FkO3ZhciBnPVwiXCI7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07dmFyIGY9dGhpcy5hSGVhZGVyW2RdO3ZhciBtPXRoaXMuYVNpZ25hdHVyZVtkXTt2YXIgYj1mK1wiLlwiK2srXCIuXCIrbTt2YXIgaj1uZXcgS0pVUi5qd3MuSldTKCk7dHJ5e3ZhciBsPWoudmVyaWZ5SldTQnlQZW1YNTA5Q2VydChiLGUpO2lmKGwhPTEpe2crPShkKzEpK1widGggc2lnbmF0dXJlIHVubWF0Y2guIFwifX1jYXRjaChoKXtnKz0oZCsxKStcInRoIHNpZ25hdHVyZSBmYWlsKFwiK2grXCIpLiBcIn19aWYoZz09XCJcIil7cmV0dXJuIDF9ZWxzZXt0aHJvdyBnfX07dGhpcy5yZWFkSldTSlM9ZnVuY3Rpb24oYil7dmFyIGM9YS5yZWFkU2FmZUpTT05TdHJpbmcoYik7aWYoYz09bnVsbCl7dGhyb3dcImFyZ3VtZW50IGlzIG5vdCBKU09OIHN0cmluZzogXCIrYn10aGlzLmFIZWFkZXI9Yy5oZWFkZXJzO3RoaXMuc1BheWxvYWQ9Yy5wYXlsb2FkO3RoaXMuYVNpZ25hdHVyZT1jLnNpZ25hdHVyZXN9O3RoaXMuZ2V0SlNPTj1mdW5jdGlvbigpe3JldHVybntoZWFkZXJzOnRoaXMuYUhlYWRlcixwYXlsb2FkOnRoaXMuc1BheWxvYWQsc2lnbmF0dXJlczp0aGlzLmFTaWduYXR1cmV9fTt0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtpZih0aGlzLmFIZWFkZXIubGVuZ3RoPT0wKXtyZXR1cm4gMX1yZXR1cm4gMH19O1xuLyohIG5vZGV1dGlsLTEuMC4wIChjKSAyMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlVVRGOChhKXtyZXR1cm4gcmVxdWlyZShcImZzXCIpLnJlYWRGaWxlU3luYyhhLFwidXRmOFwiKX1mdW5jdGlvbiByZWFkRmlsZUhleEJ5QmluKGMpe3ZhciBiPXJlcXVpcmUoXCJqc3JzYXNpZ25cIik7dmFyIGE9cmVxdWlyZShcImZzXCIpO3JldHVybiBiLnJzdHJ0b2hleChhLnJlYWRGaWxlU3luYyhjLFwiYmluYXJ5XCIpKX1mdW5jdGlvbiByZWFkRmlsZShiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7cmV0dXJuIGEucmVhZEZpbGVTeW5jKGIsXCJiaW5hcnlcIil9ZnVuY3Rpb24gc2F2ZUZpbGUoYyxiKXt2YXIgYT1yZXF1aXJlKFwiZnNcIik7YS53cml0ZUZpbGVTeW5jKGMsYixcImJpbmFyeVwiKX1mdW5jdGlvbiBzYXZlRmlsZUJpbkJ5SGV4KGUsYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO3ZhciBjPXJlcXVpcmUoXCJqc3JzYXNpZ25cIik7dmFyIGQ9Yy5oZXh0b3JzdHIoYik7YS53cml0ZUZpbGVTeW5jKGUsZCxcImJpbmFyeVwiKX07XG5leHBvcnRzLlNlY3VyZVJhbmRvbSA9IFNlY3VyZVJhbmRvbTtcbmV4cG9ydHMucm5nX3NlZWRfdGltZSA9IHJuZ19zZWVkX3RpbWU7XG5cbmV4cG9ydHMuQmlnSW50ZWdlciA9IEJpZ0ludGVnZXI7XG5leHBvcnRzLlJTQUtleSA9IFJTQUtleTtcbmV4cG9ydHMuRUNEU0EgPSBLSlVSLmNyeXB0by5FQ0RTQTtcbmV4cG9ydHMuRFNBID0gS0pVUi5jcnlwdG8uRFNBO1xuZXhwb3J0cy5TaWduYXR1cmUgPSBLSlVSLmNyeXB0by5TaWduYXR1cmU7XG5leHBvcnRzLk1lc3NhZ2VEaWdlc3QgPSBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0O1xuZXhwb3J0cy5NYWMgPSBLSlVSLmNyeXB0by5NYWM7XG5leHBvcnRzLktFWVVUSUwgPSBLRVlVVElMO1xuZXhwb3J0cy5BU04xSEVYID0gQVNOMUhFWDtcbmV4cG9ydHMuWDUwOSA9IFg1MDk7XG5leHBvcnRzLkNyeXB0b0pTID0gQ3J5cHRvSlM7XG5cbi8vIGV4dC9iYXNlNjQuanNcbmV4cG9ydHMuYjY0dG9oZXggPSBiNjR0b2hleDtcbmV4cG9ydHMuYjY0dG9CQSA9IGI2NHRvQkE7XG5cbi8vIGJhc2U2NHguanNcbmV4cG9ydHMuc3RvQkEgPSBzdG9CQTtcbmV4cG9ydHMuQkF0b3MgPSBCQXRvcztcbmV4cG9ydHMuQkF0b2hleCA9IEJBdG9oZXg7XG5leHBvcnRzLnN0b2hleCA9IHN0b2hleDtcbmV4cG9ydHMuc3RvYjY0ID0gc3RvYjY0O1xuZXhwb3J0cy5zdG9iNjR1ID0gc3RvYjY0dTtcbmV4cG9ydHMuYjY0dXRvcyA9IGI2NHV0b3M7XG5leHBvcnRzLmI2NHRvYjY0dSA9IGI2NHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvYjY0ID0gYjY0dXRvYjY0O1xuZXhwb3J0cy5oZXgyYjY0ID0gaGV4MmI2NDtcbmV4cG9ydHMuaGV4dG9iNjR1ID0gaGV4dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG9oZXggPSBiNjR1dG9oZXg7XG5leHBvcnRzLmI2NHRvaGV4ID0gYjY0dG9oZXg7XG5leHBvcnRzLnV0Zjh0b2I2NHUgPSB1dGY4dG9iNjR1O1xuZXhwb3J0cy5iNjR1dG91dGY4ID0gYjY0dXRvdXRmODtcbmV4cG9ydHMudXRmOHRvYjY0ID0gdXRmOHRvYjY0O1xuZXhwb3J0cy5iNjR0b3V0ZjggPSBiNjR0b3V0Zjg7XG5leHBvcnRzLnV0Zjh0b2hleCA9IHV0Zjh0b2hleDtcbmV4cG9ydHMuaGV4dG91dGY4ID0gaGV4dG91dGY4O1xuZXhwb3J0cy5oZXh0b3JzdHIgPSBoZXh0b3JzdHI7XG5leHBvcnRzLnJzdHJ0b2hleCA9IHJzdHJ0b2hleDtcbmV4cG9ydHMubmV3bGluZV90b1VuaXggPSBuZXdsaW5lX3RvVW5peDtcbmV4cG9ydHMubmV3bGluZV90b0RvcyA9IG5ld2xpbmVfdG9Eb3M7XG5leHBvcnRzLmludGFyeXN0cnRvaGV4ID0gaW50YXJ5c3RydG9oZXg7XG5leHBvcnRzLnN0cmRpZmZpZHggPSBzdHJkaWZmaWR4O1xuXG5leHBvcnRzLmNyeXB0byA9IEtKVVIuY3J5cHRvO1xuZXhwb3J0cy5hc24xID0gS0pVUi5hc24xO1xuZXhwb3J0cy5qd3MgPSBLSlVSLmp3cztcblxuZXhwb3J0cy5yZWFkRmlsZVVURjggPSByZWFkRmlsZVVURjg7XG5leHBvcnRzLnJlYWRGaWxlSGV4QnlCaW4gPSByZWFkRmlsZUhleEJ5QmluO1xuZXhwb3J0cy5yZWFkRmlsZSA9IHJlYWRGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZSA9IHNhdmVGaWxlO1xuZXhwb3J0cy5zYXZlRmlsZUJpbkJ5SGV4ID0gc2F2ZUZpbGVCaW5CeUhleDtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSAzMDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxudmFyIHJvb3RQYXJlbnQgPSB7fVxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIFNhZmFyaSA1LTcgbGFja3Mgc3VwcG9ydCBmb3IgY2hhbmdpbmcgdGhlIGBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yYCBwcm9wZXJ0eVxuICogICAgIG9uIG9iamVjdHMuXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICBmdW5jdGlvbiBCYXIgKCkge31cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuZm9vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAgIGFyci5jb25zdHJ1Y3RvciA9IEJhclxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIGFyci5jb25zdHJ1Y3RvciA9PT0gQmFyICYmIC8vIGNvbnN0cnVjdG9yIGNhbiBiZSBzZXRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuLyoqXG4gKiBDbGFzczogQnVmZmVyXG4gKiA9PT09PT09PT09PT09XG4gKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBhcmUgYXVnbWVudGVkXG4gKiB3aXRoIGZ1bmN0aW9uIHByb3BlcnRpZXMgZm9yIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBBUEkgZnVuY3Rpb25zLiBXZSB1c2VcbiAqIGBVaW50OEFycmF5YCBzbyB0aGF0IHNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0IHJldHVybnNcbiAqIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIEJ5IGF1Z21lbnRpbmcgdGhlIGluc3RhbmNlcywgd2UgY2FuIGF2b2lkIG1vZGlmeWluZyB0aGUgYFVpbnQ4QXJyYXlgXG4gKiBwcm90b3R5cGUuXG4gKi9cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgLy8gQXZvaWQgZ29pbmcgdGhyb3VnaCBhbiBBcmd1bWVudHNBZGFwdG9yVHJhbXBvbGluZSBpbiB0aGUgY29tbW9uIGNhc2UuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGFyZ3VtZW50c1sxXSlcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpcy5sZW5ndGggPSAwXG4gICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLCBhcmcpXG4gIH1cblxuICAvLyBTbGlnaHRseSBsZXNzIGNvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGlzLCBhcmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogJ3V0ZjgnKVxuICB9XG5cbiAgLy8gVW51c3VhbC5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhpcywgYXJnKVxufVxuXG5mdW5jdGlvbiBmcm9tTnVtYmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChsZW5ndGgpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIC8vIEFzc3VtcHRpb246IGJ5dGVMZW5ndGgoKSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDwga01heExlbmd0aC5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpKSByZXR1cm4gZnJvbUJ1ZmZlcih0aGF0LCBvYmplY3QpXG5cbiAgaWYgKGlzQXJyYXkob2JqZWN0KSkgcmV0dXJuIGZyb21BcnJheSh0aGF0LCBvYmplY3QpXG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzdGFydCB3aXRoIG51bWJlciwgYnVmZmVyLCBhcnJheSBvciBzdHJpbmcnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob2JqZWN0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbVR5cGVkQXJyYXkodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChvYmplY3QubGVuZ3RoKSByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmplY3QpXG5cbiAgcmV0dXJuIGZyb21Kc29uT2JqZWN0KHRoYXQsIG9iamVjdClcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlciAodGhhdCwgYnVmZmVyKSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGJ1ZmZlci5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBidWZmZXIuY29weSh0aGF0LCAwLCAwLCBsZW5ndGgpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIER1cGxpY2F0ZSBvZiBmcm9tQXJyYXkoKSB0byBrZWVwIGZyb21BcnJheSgpIG1vbm9tb3JwaGljLlxuZnVuY3Rpb24gZnJvbVR5cGVkQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIC8vIFRydW5jYXRpbmcgdGhlIGVsZW1lbnRzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHBlb3BsZSBleHBlY3QgZnJvbSB0eXBlZFxuICAvLyBhcnJheXMgd2l0aCBCWVRFU19QRVJfRUxFTUVOVCA+IDEgYnV0IGl0J3MgY29tcGF0aWJsZSB3aXRoIHRoZSBiZWhhdmlvclxuICAvLyBvZiB0aGUgb2xkIEJ1ZmZlciBjb25zdHJ1Y3Rvci5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXkpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgYXJyYXkuYnl0ZUxlbmd0aFxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbVR5cGVkQXJyYXkodGhhdCwgbmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEZXNlcmlhbGl6ZSB7IHR5cGU6ICdCdWZmZXInLCBkYXRhOiBbMSwyLDMsLi4uXSB9IGludG8gYSBCdWZmZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHplcm8tbGVuZ3RoIGJ1ZmZlciBmb3IgaW5wdXRzIHRoYXQgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3BlYy5cbmZ1bmN0aW9uIGZyb21Kc29uT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgdmFyIGFycmF5XG4gIHZhciBsZW5ndGggPSAwXG5cbiAgaWYgKG9iamVjdC50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iamVjdC5kYXRhKSkge1xuICAgIGFycmF5ID0gb2JqZWN0LmRhdGFcbiAgICBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIH1cbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbn0gZWxzZSB7XG4gIC8vIHByZS1zZXQgZm9yIHZhbHVlcyB0aGF0IG1heSBleGlzdCBpbiB0aGUgZnV0dXJlXG4gIEJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gdW5kZWZpbmVkXG4gIEJ1ZmZlci5wcm90b3R5cGUucGFyZW50ID0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGFsbG9jYXRlICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShsZW5ndGgpKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICAgIHRoYXQuX2lzQnVmZmVyID0gdHJ1ZVxuICB9XG5cbiAgdmFyIGZyb21Qb29sID0gbGVuZ3RoICE9PSAwICYmIGxlbmd0aCA8PSBCdWZmZXIucG9vbFNpemUgPj4+IDFcbiAgaWYgKGZyb21Qb29sKSB0aGF0LnBhcmVudCA9IHJvb3RQYXJlbnRcblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKHN1YmplY3QsIGVuY29kaW5nKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTbG93QnVmZmVyKSkgcmV0dXJuIG5ldyBTbG93QnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKHN1YmplY3QsIGVuY29kaW5nKVxuICBkZWxldGUgYnVmLnBhcmVudFxuICByZXR1cm4gYnVmXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICB2YXIgaSA9IDBcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIGJyZWFrXG5cbiAgICArK2lcbiAgfVxuXG4gIGlmIChpICE9PSBsZW4pIHtcbiAgICB4ID0gYVtpXVxuICAgIHkgPSBiW2ldXG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3Jhdyc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xpc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzLicpXG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXVxuICAgIGl0ZW0uY29weShidWYsIHBvcylcbiAgICBwb3MgKz0gaXRlbS5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSBzdHJpbmcgPSAnJyArIHN0cmluZ1xuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgLy8gRGVwcmVjYXRlZFxuICAgICAgY2FzZSAncmF3JzpcbiAgICAgIGNhc2UgJ3Jhd3MnOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIHN0YXJ0ID0gc3RhcnQgfCAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gSW5maW5pdHkgPyB0aGlzLmxlbmd0aCA6IGVuZCB8IDBcblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gJydcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIDBcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCkge1xuICBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIGJ5dGVPZmZzZXQgPj49IDBcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAtMVxuICBpZiAoYnl0ZU9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIC0xXG5cbiAgLy8gTmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLmxlbmd0aCArIGJ5dGVPZmZzZXQsIDApXG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHJldHVybiAtMSAvLyBzcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZyBhbHdheXMgZmFpbHNcbiAgICByZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCBbIHZhbCBdLCBieXRlT2Zmc2V0KVxuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCkge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKHZhciBpID0gMDsgYnl0ZU9mZnNldCArIGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJbYnl0ZU9mZnNldCArIGldID09PSB2YWxbZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXhdKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsLmxlbmd0aCkgcmV0dXJuIGJ5dGVPZmZzZXQgKyBmb3VuZEluZGV4XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG4vLyBgZ2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAob2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuZ2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy5yZWFkVUludDgob2Zmc2V0KVxufVxuXG4vLyBgc2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAodiwgb2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuc2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy53cml0ZVVJbnQ4KHYsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiaW5hcnlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoIHwgMFxuICAgIGxlbmd0aCA9IHN3YXBcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBiaW5hcnlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gQnVmZmVyLl9hdWdtZW50KHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgaSsrKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3QnVmLmxlbmd0aCkgbmV3QnVmLnBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXNcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuX3NldCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksIHRhcmdldFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBmaWxsKHZhbHVlLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gIGlmICghdmFsdWUpIHZhbHVlID0gMFxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQpIGVuZCA9IHRoaXMubGVuZ3RoXG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIDwgc3RhcnQnKVxuXG4gIC8vIEZpbGwgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCBvdXQgb2YgYm91bmRzJylcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSB1dGY4VG9CeXRlcyh2YWx1ZS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEFycmF5QnVmZmVyYCB3aXRoIHRoZSAqY29waWVkKiBtZW1vcnkgb2YgdGhlIGJ1ZmZlciBpbnN0YW5jZS5cbiAqIEFkZGVkIGluIE5vZGUgMC4xMi4gT25seSBhdmFpbGFibGUgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IEFycmF5QnVmZmVyLlxuICovXG5CdWZmZXIucHJvdG90eXBlLnRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiB0b0FycmF5QnVmZmVyICgpIHtcbiAgaWYgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIChuZXcgQnVmZmVyKHRoaXMpKS5idWZmZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KHRoaXMubGVuZ3RoKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBidWZbaV0gPSB0aGlzW2ldXG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmLmJ1ZmZlclxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdWZmZXIudG9BcnJheUJ1ZmZlciBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcicpXG4gIH1cbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgQlAgPSBCdWZmZXIucHJvdG90eXBlXG5cbi8qKlxuICogQXVnbWVudCBhIFVpbnQ4QXJyYXkgKmluc3RhbmNlKiAobm90IHRoZSBVaW50OEFycmF5IGNsYXNzISkgd2l0aCBCdWZmZXIgbWV0aG9kc1xuICovXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiBfYXVnbWVudCAoYXJyKSB7XG4gIGFyci5jb25zdHJ1Y3RvciA9IEJ1ZmZlclxuICBhcnIuX2lzQnVmZmVyID0gdHJ1ZVxuXG4gIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIFVpbnQ4QXJyYXkgc2V0IG1ldGhvZCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgYXJyLl9zZXQgPSBhcnIuc2V0XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBhcnIuZ2V0ID0gQlAuZ2V0XG4gIGFyci5zZXQgPSBCUC5zZXRcblxuICBhcnIud3JpdGUgPSBCUC53cml0ZVxuICBhcnIudG9TdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9Mb2NhbGVTdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9KU09OID0gQlAudG9KU09OXG4gIGFyci5lcXVhbHMgPSBCUC5lcXVhbHNcbiAgYXJyLmNvbXBhcmUgPSBCUC5jb21wYXJlXG4gIGFyci5pbmRleE9mID0gQlAuaW5kZXhPZlxuICBhcnIuY29weSA9IEJQLmNvcHlcbiAgYXJyLnNsaWNlID0gQlAuc2xpY2VcbiAgYXJyLnJlYWRVSW50TEUgPSBCUC5yZWFkVUludExFXG4gIGFyci5yZWFkVUludEJFID0gQlAucmVhZFVJbnRCRVxuICBhcnIucmVhZFVJbnQ4ID0gQlAucmVhZFVJbnQ4XG4gIGFyci5yZWFkVUludDE2TEUgPSBCUC5yZWFkVUludDE2TEVcbiAgYXJyLnJlYWRVSW50MTZCRSA9IEJQLnJlYWRVSW50MTZCRVxuICBhcnIucmVhZFVJbnQzMkxFID0gQlAucmVhZFVJbnQzMkxFXG4gIGFyci5yZWFkVUludDMyQkUgPSBCUC5yZWFkVUludDMyQkVcbiAgYXJyLnJlYWRJbnRMRSA9IEJQLnJlYWRJbnRMRVxuICBhcnIucmVhZEludEJFID0gQlAucmVhZEludEJFXG4gIGFyci5yZWFkSW50OCA9IEJQLnJlYWRJbnQ4XG4gIGFyci5yZWFkSW50MTZMRSA9IEJQLnJlYWRJbnQxNkxFXG4gIGFyci5yZWFkSW50MTZCRSA9IEJQLnJlYWRJbnQxNkJFXG4gIGFyci5yZWFkSW50MzJMRSA9IEJQLnJlYWRJbnQzMkxFXG4gIGFyci5yZWFkSW50MzJCRSA9IEJQLnJlYWRJbnQzMkJFXG4gIGFyci5yZWFkRmxvYXRMRSA9IEJQLnJlYWRGbG9hdExFXG4gIGFyci5yZWFkRmxvYXRCRSA9IEJQLnJlYWRGbG9hdEJFXG4gIGFyci5yZWFkRG91YmxlTEUgPSBCUC5yZWFkRG91YmxlTEVcbiAgYXJyLnJlYWREb3VibGVCRSA9IEJQLnJlYWREb3VibGVCRVxuICBhcnIud3JpdGVVSW50OCA9IEJQLndyaXRlVUludDhcbiAgYXJyLndyaXRlVUludExFID0gQlAud3JpdGVVSW50TEVcbiAgYXJyLndyaXRlVUludEJFID0gQlAud3JpdGVVSW50QkVcbiAgYXJyLndyaXRlVUludDE2TEUgPSBCUC53cml0ZVVJbnQxNkxFXG4gIGFyci53cml0ZVVJbnQxNkJFID0gQlAud3JpdGVVSW50MTZCRVxuICBhcnIud3JpdGVVSW50MzJMRSA9IEJQLndyaXRlVUludDMyTEVcbiAgYXJyLndyaXRlVUludDMyQkUgPSBCUC53cml0ZVVJbnQzMkJFXG4gIGFyci53cml0ZUludExFID0gQlAud3JpdGVJbnRMRVxuICBhcnIud3JpdGVJbnRCRSA9IEJQLndyaXRlSW50QkVcbiAgYXJyLndyaXRlSW50OCA9IEJQLndyaXRlSW50OFxuICBhcnIud3JpdGVJbnQxNkxFID0gQlAud3JpdGVJbnQxNkxFXG4gIGFyci53cml0ZUludDE2QkUgPSBCUC53cml0ZUludDE2QkVcbiAgYXJyLndyaXRlSW50MzJMRSA9IEJQLndyaXRlSW50MzJMRVxuICBhcnIud3JpdGVJbnQzMkJFID0gQlAud3JpdGVJbnQzMkJFXG4gIGFyci53cml0ZUZsb2F0TEUgPSBCUC53cml0ZUZsb2F0TEVcbiAgYXJyLndyaXRlRmxvYXRCRSA9IEJQLndyaXRlRmxvYXRCRVxuICBhcnIud3JpdGVEb3VibGVMRSA9IEJQLndyaXRlRG91YmxlTEVcbiAgYXJyLndyaXRlRG91YmxlQkUgPSBCUC53cml0ZURvdWJsZUJFXG4gIGFyci5maWxsID0gQlAuZmlsbFxuICBhcnIuaW5zcGVjdCA9IEJQLmluc3BlY3RcbiAgYXJyLnRvQXJyYXlCdWZmZXIgPSBCUC50b0FycmF5QnVmZmVyXG5cbiAgcmV0dXJuIGFyclxufVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAzMDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBsb29rdXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbjsoZnVuY3Rpb24gKGV4cG9ydHMpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG4gIHZhciBBcnIgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKVxuICAgID8gVWludDhBcnJheVxuICAgIDogQXJyYXlcblxuXHR2YXIgUExVUyAgID0gJysnLmNoYXJDb2RlQXQoMClcblx0dmFyIFNMQVNIICA9ICcvJy5jaGFyQ29kZUF0KDApXG5cdHZhciBOVU1CRVIgPSAnMCcuY2hhckNvZGVBdCgwKVxuXHR2YXIgTE9XRVIgID0gJ2EnLmNoYXJDb2RlQXQoMClcblx0dmFyIFVQUEVSICA9ICdBJy5jaGFyQ29kZUF0KDApXG5cdHZhciBQTFVTX1VSTF9TQUZFID0gJy0nLmNoYXJDb2RlQXQoMClcblx0dmFyIFNMQVNIX1VSTF9TQUZFID0gJ18nLmNoYXJDb2RlQXQoMClcblxuXHRmdW5jdGlvbiBkZWNvZGUgKGVsdCkge1xuXHRcdHZhciBjb2RlID0gZWx0LmNoYXJDb2RlQXQoMClcblx0XHRpZiAoY29kZSA9PT0gUExVUyB8fFxuXHRcdCAgICBjb2RlID09PSBQTFVTX1VSTF9TQUZFKVxuXHRcdFx0cmV0dXJuIDYyIC8vICcrJ1xuXHRcdGlmIChjb2RlID09PSBTTEFTSCB8fFxuXHRcdCAgICBjb2RlID09PSBTTEFTSF9VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MyAvLyAnLydcblx0XHRpZiAoY29kZSA8IE5VTUJFUilcblx0XHRcdHJldHVybiAtMSAvL25vIG1hdGNoXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIgKyAxMClcblx0XHRcdHJldHVybiBjb2RlIC0gTlVNQkVSICsgMjYgKyAyNlxuXHRcdGlmIChjb2RlIDwgVVBQRVIgKyAyNilcblx0XHRcdHJldHVybiBjb2RlIC0gVVBQRVJcblx0XHRpZiAoY29kZSA8IExPV0VSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIExPV0VSICsgMjZcblx0fVxuXG5cdGZ1bmN0aW9uIGI2NFRvQnl0ZUFycmF5IChiNjQpIHtcblx0XHR2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuXG5cdFx0aWYgKGI2NC5sZW5ndGggJSA0ID4gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jylcblx0XHR9XG5cblx0XHQvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuXHRcdC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcblx0XHQvLyByZXByZXNlbnQgb25lIGJ5dGVcblx0XHQvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcblx0XHQvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG5cdFx0dmFyIGxlbiA9IGI2NC5sZW5ndGhcblx0XHRwbGFjZUhvbGRlcnMgPSAnPScgPT09IGI2NC5jaGFyQXQobGVuIC0gMikgPyAyIDogJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDEpID8gMSA6IDBcblxuXHRcdC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuXHRcdGFyciA9IG5ldyBBcnIoYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG5cdFx0Ly8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuXHRcdGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gYjY0Lmxlbmd0aCAtIDQgOiBiNjQubGVuZ3RoXG5cblx0XHR2YXIgTCA9IDBcblxuXHRcdGZ1bmN0aW9uIHB1c2ggKHYpIHtcblx0XHRcdGFycltMKytdID0gdlxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMTgpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPDwgMTIpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPDwgNikgfCBkZWNvZGUoYjY0LmNoYXJBdChpICsgMykpXG5cdFx0XHRwdXNoKCh0bXAgJiAweEZGMDAwMCkgPj4gMTYpXG5cdFx0XHRwdXNoKCh0bXAgJiAweEZGMDApID4+IDgpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0aWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuXHRcdFx0dG1wID0gKGRlY29kZShiNjQuY2hhckF0KGkpKSA8PCAyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpID4+IDQpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMTApIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAxKSkgPDwgNCkgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDIpKSA+PiAyKVxuXHRcdFx0cHVzaCgodG1wID4+IDgpICYgMHhGRilcblx0XHRcdHB1c2godG1wICYgMHhGRilcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyXG5cdH1cblxuXHRmdW5jdGlvbiB1aW50OFRvQmFzZTY0ICh1aW50OCkge1xuXHRcdHZhciBpLFxuXHRcdFx0ZXh0cmFCeXRlcyA9IHVpbnQ4Lmxlbmd0aCAlIDMsIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG5cdFx0XHRvdXRwdXQgPSBcIlwiLFxuXHRcdFx0dGVtcCwgbGVuZ3RoXG5cblx0XHRmdW5jdGlvbiBlbmNvZGUgKG51bSkge1xuXHRcdFx0cmV0dXJuIGxvb2t1cC5jaGFyQXQobnVtKVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlKG51bSA+PiAxOCAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiAxMiAmIDB4M0YpICsgZW5jb2RlKG51bSA+PiA2ICYgMHgzRikgKyBlbmNvZGUobnVtICYgMHgzRilcblx0XHR9XG5cblx0XHQvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gdWludDgubGVuZ3RoIC0gZXh0cmFCeXRlczsgaSA8IGxlbmd0aDsgaSArPSAzKSB7XG5cdFx0XHR0ZW1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuXHRcdFx0b3V0cHV0ICs9IHRyaXBsZXRUb0Jhc2U2NCh0ZW1wKVxuXHRcdH1cblxuXHRcdC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcblx0XHRzd2l0Y2ggKGV4dHJhQnl0ZXMpIHtcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dGVtcCA9IHVpbnQ4W3VpbnQ4Lmxlbmd0aCAtIDFdXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAyKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wIDw8IDQpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9ICc9PSdcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0dGVtcCA9ICh1aW50OFt1aW50OC5sZW5ndGggLSAyXSA8PCA4KSArICh1aW50OFt1aW50OC5sZW5ndGggLSAxXSlcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSh0ZW1wID4+IDEwKVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKCh0ZW1wID4+IDQpICYgMHgzRilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCAyKSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPSdcblx0XHRcdFx0YnJlYWtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0XG5cdH1cblxuXHRleHBvcnRzLnRvQnl0ZUFycmF5ID0gYjY0VG9CeXRlQXJyYXlcblx0ZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gdWludDhUb0Jhc2U2NFxufSh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyAodGhpcy5iYXNlNjRqcyA9IHt9KSA6IGV4cG9ydHMpKVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2Jhc2U2NC1qcy9saWIvYjY0LmpzXG4gKiogbW9kdWxlIGlkID0gMzA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9pZWVlNzU0L2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMzA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9pc2FycmF5L2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMzA4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5pbXBvcnQgU2lnbmluU3RhdGUgZnJvbSAnLi9TaWduaW5TdGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25pblJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgLy8gbWFuZGF0b3J5XG4gICAgICAgIHVybCwgY2xpZW50X2lkLCByZWRpcmVjdF91cmksIHJlc3BvbnNlX3R5cGUsIHNjb3BlLCBhdXRob3JpdHksXG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIGRhdGEsIHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlc1xuICAgIH0pIHtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNsaWVudF9pZCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gY2xpZW50X2lkIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50X2lkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVkaXJlY3RfdXJpKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyByZWRpcmVjdF91cmkgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWRpcmVjdF91cmlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNwb25zZV90eXBlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyByZXNwb25zZV90eXBlIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVzcG9uc2VfdHlwZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjb3BlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzY29wZSBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjb3BlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYXV0aG9yaXR5KSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhdXRob3JpdHkgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRob3JpdHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2lkYyA9IFNpZ25pblJlcXVlc3QuaXNPaWRjKHJlc3BvbnNlX3R5cGUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFNpZ25pblN0YXRlKHsgbm9uY2U6IG9pZGMsIGRhdGEsIGNsaWVudF9pZCwgYXV0aG9yaXR5IH0pO1xuXG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwiY2xpZW50X2lkXCIsIGNsaWVudF9pZCk7XG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicmVkaXJlY3RfdXJpXCIsIHJlZGlyZWN0X3VyaSk7XG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwicmVzcG9uc2VfdHlwZVwiLCByZXNwb25zZV90eXBlKTtcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzY29wZVwiLCBzY29wZSk7XG4gICAgICAgIFxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInN0YXRlXCIsIHRoaXMuc3RhdGUuaWQpO1xuICAgICAgICBpZiAob2lkYykge1xuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJub25jZVwiLCB0aGlzLnN0YXRlLm5vbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcHRpb25hbCA9IHsgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzIH07XG4gICAgICAgIGZvcihsZXQga2V5IGluIG9wdGlvbmFsKXtcbiAgICAgICAgICAgIGlmIChvcHRpb25hbFtrZXldKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwga2V5LCBvcHRpb25hbFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc09pZGMocmVzcG9uc2VfdHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT09IFwiaWRfdG9rZW5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgaXNPQXV0aChyZXNwb25zZV90eXBlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZXNwb25zZV90eXBlLnNwbGl0KC9cXHMrL2cpLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbSA9PT0gXCJ0b2tlblwiO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICEhKHJlc3VsdFswXSk7XG4gICAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1NpZ25pblJlcXVlc3QuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi9HbG9iYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcmxVdGlsaXR5IHtcbiAgICBzdGF0aWMgYWRkUXVlcnlQYXJhbSh1cmwsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgICAgdXJsICs9IFwiP1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09IFwiP1wiKSB7XG4gICAgICAgICAgICB1cmwgKz0gXCImXCI7XG4gICAgICAgIH1cblxuICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xuICAgICAgICB1cmwgKz0gXCI9XCI7XG4gICAgICAgIHVybCArPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlVXJsRnJhZ21lbnQodmFsdWUsIGRlbGltaXRlciA9IFwiI1wiLCBnbG9iYWwgPSBHbG9iYWwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnRcIik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpe1xuICAgICAgICAgICAgdmFsdWUgPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpZHggPSB2YWx1ZS5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyKGlkeCArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcmFtcyA9IHt9LFxuICAgICAgICAgICAgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nLFxuICAgICAgICAgICAgbTtcblxuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIHdoaWxlIChtID0gcmVnZXguZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobVsxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMl0pO1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIrKyA+IDUwKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwicmVzcG9uc2UgZXhjZWVkZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnNcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBcIlJlc3BvbnNlIGV4Y2VlZGVkIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXJsVXRpbGl0eS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25pblN0YXRlIGV4dGVuZHMgU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKHtub25jZSwgYXV0aG9yaXR5LCBjbGllbnRfaWR9ID0ge30pIHtcbiAgICAgICAgc3VwZXIoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChub25jZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbm9uY2UgPSByYW5kb20oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub25jZSkge1xuICAgICAgICAgICAgdGhpcy5fbm9uY2UgPSBub25jZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xuICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSBjbGllbnRfaWQ7XG4gICAgfVxuXG4gICAgZ2V0IG5vbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9uY2U7XG4gICAgfVxuICAgIGdldCBhdXRob3JpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRob3JpdHk7XG4gICAgfVxuICAgIGdldCBjbGllbnRfaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XG4gICAgfVxuICAgIFxuICAgIHRvU3RvcmFnZVN0cmluZygpIHtcbiAgICAgICAgTG9nLmluZm8oXCJTaWduaW5TdGF0ZS50b1N0b3JhZ2VTdHJpbmdcIik7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZCxcbiAgICAgICAgICAgIG5vbmNlOiB0aGlzLm5vbmNlLFxuICAgICAgICAgICAgYXV0aG9yaXR5OiB0aGlzLmF1dGhvcml0eSxcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRfaWRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcbiAgICAgICAgTG9nLmluZm8oXCJTaWduaW5TdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25pblN0YXRlKGRhdGEpO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1NpZ25pblN0YXRlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKHtpZCwgZGF0YSwgY3JlYXRlZH0gPSB7fSkge1xuICAgICAgICB0aGlzLl9pZCA9IGlkIHx8IHJhbmRvbSgpO1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcblxuICAgICAgICBpZiAodHlwZW9mIGNyZWF0ZWQgPT09ICdudW1iZXInICYmIGNyZWF0ZWQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkID0gY3JlYXRlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICBnZXQgY3JlYXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZWQ7XG4gICAgfVxuXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlN0YXRlLnRvU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xuICAgICAgICBMb2cuaW5mbyhcIlN0YXRlLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFN0YXRlKEpTT04ucGFyc2Uoc3RvcmFnZVN0cmluZykpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclN0YWxlU3RhdGUoc3RvcmFnZSwgYWdlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiU3RhdGUuY2xlYXJTdGFsZVN0YXRlXCIpO1xuXG4gICAgICAgIHZhciBjdXRvZmYgPSBEYXRlLm5vdygpIC8gMTAwMCAtIGFnZTtcblxuICAgICAgICByZXR1cm4gc3RvcmFnZS5nZXRBbGxLZXlzKCkudGhlbihrZXlzID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiZ290IGtleXNcIiwga2V5cyk7XG5cbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHN0b3JhZ2UuZ2V0KGtleSkudGhlbihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW92ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IFN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKGl0ZW0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBpdGVtIGZyb20ga2V5OiBcIiwga2V5LCBzdGF0ZS5jcmVhdGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5jcmVhdGVkIDw9IGN1dG9mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiRXJyb3IgcGFyc2luZyBzdGF0ZSBmb3Iga2V5XCIsIGtleSwgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJubyBpdGVtIGluIHN0b3JhZ2UgZm9yIGtleTogXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJyZW1vdmVkIGl0ZW0gZm9yIGtleTogXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmUoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmluZm8oXCJ3YWl0aW5nIG9uIHByb21pc2UgY291bnQ6XCIsIHByb21pc2VzLmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TdGF0ZS5qc1xuICoqLyIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRhbEpTIHYxLjAuOFxuLy8gQHByZXNlcnZlIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuXG4vLyBBbGwgUmlnaHRzIFJlc2VydmVkXG4vLyBBcGFjaGUgTGljZW5zZSAyLjBcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTk9USUNFOiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgTWljcm9zb2Z0XG4vLyBvcmlnaW5hbCBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL2F6dXJlLWFjdGl2ZWRpcmVjdG9yeS1saWJyYXJ5LWZvci1qcy9ibG9iL21hc3Rlci9saWIvYWRhbC5qcyNMMTAyOVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5kb20oKSB7XG4gICAgdmFyIGd1aWRIb2xkZXIgPSAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnO1xuICAgIHZhciBoZXggPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBndWlkUmVzcG9uc2UgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3VpZEhvbGRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSAhPT0gJy0nICYmIGd1aWRIb2xkZXJbaV0gIT09ICc0Jykge1xuICAgICAgICAgICAgLy8gZWFjaCB4IGFuZCB5IG5lZWRzIHRvIGJlIHJhbmRvbVxuICAgICAgICAgICAgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3VpZEhvbGRlcltpXSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gaGV4W3JdO1xuICAgICAgICB9IGVsc2UgaWYgKGd1aWRIb2xkZXJbaV0gPT09ICd5Jykge1xuICAgICAgICAgICAgLy8gY2xvY2stc2VxLWFuZC1yZXNlcnZlZCBmaXJzdCBoZXggaXMgZmlsdGVyZWQgYW5kIHJlbWFpbmluZyBoZXggdmFsdWVzIGFyZSByYW5kb21cbiAgICAgICAgICAgIHIgJj0gMHgzOyAvLyBiaXQgYW5kIHdpdGggMDAxMSB0byBzZXQgcG9zIDIgdG8gemVybyA/MD8/XG4gICAgICAgICAgICByIHw9IDB4ODsgLy8gc2V0IHBvcyAzIHRvIDEgYXMgMT8/P1xuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBndWlkSG9sZGVyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBndWlkUmVzcG9uc2U7XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmFuZG9tLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcblxuY29uc3QgT2lkY1Njb3BlID0gXCJvcGVuaWRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbmluUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKHVybCkge1xuXG4gICAgICAgIHZhciB2YWx1ZXMgPSBVcmxVdGlsaXR5LnBhcnNlVXJsRnJhZ21lbnQodXJsLCBcIiNcIik7XG5cbiAgICAgICAgdGhpcy5lcnJvciA9IHZhbHVlcy5lcnJvcjtcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IHZhbHVlcy5lcnJvcl9kZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5lcnJvcl91cmkgPSB2YWx1ZXMuZXJyb3JfdXJpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IHZhbHVlcy5pZF90b2tlbjtcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gdmFsdWVzLnNlc3Npb25fc3RhdGU7XG4gICAgICAgIHRoaXMuYWNjZXNzX3Rva2VuID0gdmFsdWVzLmFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdmFsdWVzLnRva2VuX3R5cGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB2YWx1ZXMuc2NvcGU7XG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHVuZGVmaW5lZDsgLy8gd2lsbCBiZSBzZXQgZnJvbSBSZXNwb25zZVZhbGlkYXRvclxuXG4gICAgICAgIGxldCBleHBpcmVzX2luID0gcGFyc2VJbnQodmFsdWVzLmV4cGlyZXNfaW4pO1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZXNfaW4gPT09ICdudW1iZXInICYmIGV4cGlyZXNfaW4gPiAwKSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gbm93ICsgZXhwaXJlc19pbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBleHBpcmVzX2luKCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwaXJlc19hdCAtIG5vdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBleHBpcmVkKCkge1xuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBzY29wZXMoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XG4gICAgfVxuICAgIFxuICAgIGdldCBpc09wZW5JZENvbm5lY3QoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVzLmluZGV4T2YoT2lkY1Njb3BlKSA+PSAwO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1NpZ25pblJlc3BvbnNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgVXJsVXRpbGl0eSBmcm9tICcuL1VybFV0aWxpdHknO1xuaW1wb3J0IFN0YXRlIGZyb20gJy4vU3RhdGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWdub3V0UmVxdWVzdCB7XG4gICAgY29uc3RydWN0b3Ioe3VybCwgaWRfdG9rZW5faGludCwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLCBkYXRhfSkge1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHBhc3NlZCB0byBTaWdub3V0UmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZF90b2tlbl9oaW50KSB7XG4gICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImlkX3Rva2VuX2hpbnRcIiwgaWRfdG9rZW5faGludCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiLCBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUoeyBkYXRhIH0pO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1NpZ25vdXRSZXF1ZXN0LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbm91dFJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcblxuICAgICAgICB2YXIgdmFsdWVzID0gVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50KHVybCwgXCI/XCIpO1xuXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XG4gICAgICAgIHRoaXMuZXJyb3JfZGVzY3JpcHRpb24gPSB2YWx1ZXMuZXJyb3JfZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gdmFsdWVzLmVycm9yX3VyaTtcblxuICAgICAgICB0aGlzLnN0YXRlID0gdmFsdWVzLnN0YXRlO1xuICAgIH1cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWdub3V0UmVzcG9uc2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5NZW1vcnlXZWJTdG9yYWdle1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG4gICAgXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgTG9nLmluZm8oXCJJbk1lbW9yeVdlYlN0b3JhZ2UuZ2V0SXRlbVwiLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldO1xuICAgIH1cbiAgICBcbiAgICBzZXRJdGVtKGtleSwgdmFsdWUpe1xuICAgICAgICBMb2cuaW5mbyhcIkluTWVtb3J5V2ViU3RvcmFnZS5zZXRJdGVtXCIsIGtleSk7XG4gICAgICAgIHRoaXMuX2RhdGFba2V5XSA9IHZhbHVlO1xuICAgIH0gICBcbiAgICBcbiAgICByZW1vdmVJdGVtKGtleSl7XG4gICAgICAgIExvZy5pbmZvKFwiSW5NZW1vcnlXZWJTdG9yYWdlLnJlbW92ZUl0ZW1cIiwga2V5KTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2RhdGFba2V5XTtcbiAgICB9XG4gICAgXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX2RhdGEpLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAga2V5KGluZGV4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKVtpbmRleF07XG4gICAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0luTWVtb3J5V2ViU3RvcmFnZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE9pZGNDbGllbnQgZnJvbSAnLi9PaWRjQ2xpZW50JztcbmltcG9ydCBVc2VyTWFuYWdlclNldHRpbmdzIGZyb20gJy4vVXNlck1hbmFnZXJTZXR0aW5ncyc7XG5pbXBvcnQgVXNlciBmcm9tICcuL1VzZXInO1xuaW1wb3J0IFVzZXJNYW5hZ2VyRXZlbnRzIGZyb20gJy4vVXNlck1hbmFnZXJFdmVudHMnO1xuaW1wb3J0IFNpbGVudFJlbmV3U2VydmljZSBmcm9tICcuL1NpbGVudFJlbmV3U2VydmljZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJNYW5hZ2VyIGV4dGVuZHMgT2lkY0NsaWVudCB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBcbiAgICAgICAgaWYgKCEoc2V0dGluZ3MgaW5zdGFuY2VvZiBVc2VyTWFuYWdlclNldHRpbmdzKSkge1xuICAgICAgICAgICAgc2V0dGluZ3MgPSBuZXcgVXNlck1hbmFnZXJTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xuXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBVc2VyTWFuYWdlckV2ZW50cyhzZXR0aW5ncyk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b21hdGljU2lsZW50UmVuZXcpIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiYXV0b21hdGljU2lsZW50UmVuZXcgaXMgY29uZmlndXJlZCwgc2V0dGluZyB1cCBzaWxlbnQgcmVuZXdcIilcbiAgICAgICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZSA9IG5ldyBTaWxlbnRSZW5ld1NlcnZpY2UodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX3JlZGlyZWN0TmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5yZWRpcmVjdE5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IF9wb3B1cE5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucG9wdXBOYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBfaWZyYW1lTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pZnJhbWVOYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBfdXNlclN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy51c2VyU3RvcmU7XG4gICAgfVxuXG4gICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cztcbiAgICB9XG5cbiAgICBnZXRVc2VyKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLmdldFVzZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIGxvYWRlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInVzZXIgbm90IGZvdW5kIGluIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVVzZXIoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIucmVtb3ZlVXNlclwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmVVc2VyKG51bGwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIHJlbW92ZWQgZnJvbSBzdG9yYWdlXCIpO1xuXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMudW5sb2FkKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNpZ25pblBvcHVwKGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwXCIpO1xuXG4gICAgICAgIGxldCB1cmwgPSBhcmdzLnJlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnBvcHVwX3JlZGlyZWN0X3VyaSB8fCB0aGlzLnNldHRpbmdzLnJlZGlyZWN0X3VyaTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHBvcHVwX3JlZGlyZWN0X3VyaSBvciByZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XG4gICAgICAgIGFyZ3MuZGlzcGxheSA9IFwicG9wdXBcIjtcblxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7XG4gICAgICAgICAgICBzdGFydFVybDogdXJsLFxuICAgICAgICAgICAgcG9wdXBXaW5kb3dGZWF0dXJlczogYXJncy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyxcbiAgICAgICAgICAgIHBvcHVwV2luZG93VGFyZ2V0OiBhcmdzLnBvcHVwV2luZG93VGFyZ2V0IHx8IHRoaXMuc2V0dGluZ3MucG9wdXBXaW5kb3dUYXJnZXRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpZ25pblBvcHVwQ2FsbGJhY2sodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUG9wdXBDYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5fcG9wdXBOYXZpZ2F0b3IpO1xuICAgIH1cblxuICAgIHNpZ25pblNpbGVudChhcmdzID0ge30pIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5TaWxlbnRcIik7XG5cbiAgICAgICAgbGV0IHVybCA9IGFyZ3MucmVkaXJlY3RfdXJpIHx8IHRoaXMuc2V0dGluZ3Muc2lsZW50X3JlZGlyZWN0X3VyaTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBzaWxlbnRfcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncy5yZWRpcmVjdF91cmkgPSB1cmw7XG4gICAgICAgIGFyZ3MucHJvbXB0ID0gXCJub25lXCI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbihhcmdzLCB0aGlzLl9pZnJhbWVOYXZpZ2F0b3IpO1xuICAgIH1cbiAgICBzaWduaW5TaWxlbnRDYWxsYmFjayh1cmwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5TaWxlbnRDYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkNhbGxiYWNrKHVybCwgdGhpcy5faWZyYW1lTmF2aWdhdG9yKTtcbiAgICB9XG5cbiAgICBfc2lnbmluKGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbmluXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZChuYXZSZXNwb25zZS51cmwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3NpZ25pbkNhbGxiYWNrKHVybCwgbmF2aWdhdG9yKSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25pbkNhbGxiYWNrXCIpO1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLmNhbGxiYWNrKHVybCk7XG4gICAgfVxuICAgIF9zaWdub3V0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbm91dFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRTdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcykudGhlbihuYXZSZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dEVuZChuYXZSZXNwb25zZS51cmwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3NpZ25vdXRDYWxsYmFjayh1cmwsIG5hdmlnYXRvcikge1xuICAgICAgICBMb2cuaW5mbyhcIl9zaWdub3V0Q2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuY2FsbGJhY2sodXJsKTtcbiAgICB9XG5cbiAgICBzaWduaW5SZWRpcmVjdChhcmdzKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3RcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5TdGFydChhcmdzLCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvcik7XG4gICAgfVxuICAgIHNpZ25pblJlZGlyZWN0Q2FsbGJhY2sodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluUmVkaXJlY3RDYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbkVuZCh1cmwgfHwgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IudXJsKTtcbiAgICB9XG4gICAgc2lnbm91dFJlZGlyZWN0KGFyZ3MpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWdub3V0UmVkaXJlY3RcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpO1xuICAgIH1cbiAgICBzaWdub3V0UmVkaXJlY3RDYWxsYmFjayh1cmwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWdub3V0UmVkaXJlY3RDYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRFbmQodXJsIHx8IHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yLnVybCk7XG4gICAgfVxuXG4gICAgX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbmluU3RhcnRcIik7XG5cbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5wcmVwYXJlKG5hdmlnYXRvclBhcmFtcykudGhlbihoYW5kbGUgPT4ge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJnb3QgbmF2aWdhdG9yIHdpbmRvdyBoYW5kbGVcIik7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25pblJlcXVlc3QoYXJncykudGhlbihzaWduaW5SZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBzaWduaW4gcmVxdWVzdFwiKTtcblxuICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWduaW5SZXF1ZXN0LnVybDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWduaW5FbmQodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25pbkVuZFwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbmluUmVzcG9uc2UodXJsKS50aGVuKHNpZ25pblJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiZ290IHNpZ25pbiByZXNwb25zZVwiKTtcblxuICAgICAgICAgICAgbGV0IHVzZXIgPSBuZXcgVXNlcihzaWduaW5SZXNwb25zZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9yZVVzZXIodXNlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIHN0b3JlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NpZ25vdXRTdGFydChhcmdzID0ge30sIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zID0ge30pIHtcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbm91dFN0YXJ0XCIpO1xuXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImxvYWRlZCBjdXJyZW50IHVzZXIgZnJvbSBzdG9yYWdlXCIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGlkX3Rva2VuID0gYXJncy5pZF90b2tlbl9oaW50IHx8IHVzZXIgJiYgdXNlci5pZF90b2tlbjtcbiAgICAgICAgICAgICAgICBpZiAoaWRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJTZXR0aW5nIGlkX3Rva2VuIGludG8gc2lnbm91dCByZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmlkX3Rva2VuX2hpbnQgPSBpZF90b2tlbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVVc2VyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciByZW1vdmVkLCBjcmVhdGluZyBzaWdub3V0IHJlcXVlc3RcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2lnbm91dFJlcXVlc3QoYXJncykudGhlbihzaWdub3V0UmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBzaWdub3V0IHJlcXVlc3RcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvclBhcmFtcy51cmwgPSBzaWdub3V0UmVxdWVzdC51cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlLm5hdmlnYXRlKG5hdmlnYXRvclBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbm91dEVuZCh1cmwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbm91dEVuZFwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbm91dFJlc3BvbnNlKHVybCkudGhlbihzaWdub3V0UmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJnb3Qgc2lnbm91dCByZXNwb25zZVwiKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNpZ25vdXRSZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IF91c2VyU3RvcmVLZXkoKSB7XG4gICAgICAgIHJldHVybiBgdXNlcjoke3RoaXMuc2V0dGluZ3MuYXV0aG9yaXR5fToke3RoaXMuc2V0dGluZ3MuY2xpZW50X2lkfWA7XG4gICAgfVxuXG4gICAgX2xvYWRVc2VyKCkge1xuICAgICAgICBMb2cuaW5mbyhcIl9sb2FkVXNlclwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLmdldCh0aGlzLl91c2VyU3RvcmVLZXkpLnRoZW4oc3RvcmFnZVN0cmluZyA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcmFnZVN0cmluZykge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBzdG9yYWdlU3RyaW5nIGxvYWRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXNlci5mcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmluZm8oXCJubyB1c2VyIHN0b3JhZ2VTdHJpbmdcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3N0b3JlVXNlcih1c2VyKSB7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIl9zdG9yZVVzZXIgc3RvcmluZyB1c2VyXCIpO1xuXG4gICAgICAgICAgICB2YXIgc3RvcmFnZVN0cmluZyA9IHVzZXIudG9TdG9yYWdlU3RyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnNldCh0aGlzLl91c2VyU3RvcmVLZXksIHN0b3JhZ2VTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJfc3RvcmVVc2VyIHJlbW92aW5nIHVzZXIgc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3RvcmUucmVtb3ZlKHRoaXMuX3VzZXJTdG9yZUtleSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Vc2VyTWFuYWdlci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IE9pZGNDbGllbnRTZXR0aW5ncyBmcm9tICcuL09pZGNDbGllbnRTZXR0aW5ncyc7XG5pbXBvcnQgUmVkaXJlY3ROYXZpZ2F0b3IgZnJvbSAnLi9SZWRpcmVjdE5hdmlnYXRvcic7XG5pbXBvcnQgUG9wdXBOYXZpZ2F0b3IgZnJvbSAnLi9Qb3B1cE5hdmlnYXRvcic7XG5pbXBvcnQgSUZyYW1lTmF2aWdhdG9yIGZyb20gJy4vSUZyYW1lTmF2aWdhdG9yJztcbmltcG9ydCBXZWJTdG9yYWdlU3RhdGVTdG9yZSBmcm9tICcuL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi9HbG9iYWwnO1xuXG5jb25zdCBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSA2MDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlck1hbmFnZXJTZXR0aW5ncyBleHRlbmRzIE9pZGNDbGllbnRTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBwb3B1cF9yZWRpcmVjdF91cmksXG4gICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXMsXG4gICAgICAgIHBvcHVwV2luZG93VGFyZ2V0LFxuICAgICAgICBzaWxlbnRfcmVkaXJlY3RfdXJpLFxuICAgICAgICBhdXRvbWF0aWNTaWxlbnRSZW5ldyA9IGZhbHNlLFxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcbiAgICAgICAgcmVkaXJlY3ROYXZpZ2F0b3IgPSBuZXcgUmVkaXJlY3ROYXZpZ2F0b3IoKSxcbiAgICAgICAgcG9wdXBOYXZpZ2F0b3IgPSBuZXcgUG9wdXBOYXZpZ2F0b3IoKSxcbiAgICAgICAgaWZyYW1lTmF2aWdhdG9yID0gbmV3IElGcmFtZU5hdmlnYXRvcigpLFxuICAgICAgICB1c2VyU3RvcmUgPSBuZXcgV2ViU3RvcmFnZVN0YXRlU3RvcmUoeyBzdG9yZTogR2xvYmFsLnNlc3Npb25TdG9yYWdlIH0pXG4gICAgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXBfcmVkaXJlY3RfdXJpID0gcG9wdXBfcmVkaXJlY3RfdXJpO1xuICAgICAgICB0aGlzLl9wb3B1cFdpbmRvd0ZlYXR1cmVzID0gcG9wdXBXaW5kb3dGZWF0dXJlcztcbiAgICAgICAgdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQgPSBwb3B1cFdpbmRvd1RhcmdldDtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3NpbGVudF9yZWRpcmVjdF91cmkgPSBzaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgICAgICB0aGlzLl9hdXRvbWF0aWNTaWxlbnRSZW5ldyA9ICEhYXV0b21hdGljU2lsZW50UmVuZXc7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XG5cbiAgICAgICAgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IgPSByZWRpcmVjdE5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5fcG9wdXBOYXZpZ2F0b3IgPSBwb3B1cE5hdmlnYXRvcjtcbiAgICAgICAgdGhpcy5faWZyYW1lTmF2aWdhdG9yID0gaWZyYW1lTmF2aWdhdG9yO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fdXNlclN0b3JlID0gdXNlclN0b3JlO1xuICAgIH1cblxuICAgIGdldCBwb3B1cF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgIGdldCBwb3B1cFdpbmRvd0ZlYXR1cmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dGZWF0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBvcHVwV2luZG93VGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBXaW5kb3dUYXJnZXQ7XG4gICAgfVxuXG4gICAgZ2V0IHNpbGVudF9yZWRpcmVjdF91cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgIH1cbiAgICBnZXQgYXV0b21hdGljU2lsZW50UmVuZXcoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLnNpbGVudF9yZWRpcmVjdF91cmkgJiYgdGhpcy5fYXV0b21hdGljU2lsZW50UmVuZXcpO1xuICAgIH1cblxuICAgIGdldCBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuICAgIH1cblxuICAgIGdldCByZWRpcmVjdE5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yO1xuICAgIH1cbiAgICBnZXQgcG9wdXBOYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cE5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IGlmcmFtZU5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lmcmFtZU5hdmlnYXRvcjtcbiAgICB9XG4gICAgXG4gICAgZ2V0IHVzZXJTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0TmF2aWdhdG9yIHtcbiAgICBcbiAgICBwcmVwYXJlKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgIH1cblxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xuICAgICAgICBMb2cuaW5mbyhcIlJlZGlyZWN0TmF2aWdhdG9yLm5hdmlnYXRlXCIpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gcGFyYW1zLnVybDtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlZGlyZWN0TmF2aWdhdG9yLnVybFwiKTtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1JlZGlyZWN0TmF2aWdhdG9yLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgUG9wdXBXaW5kb3cgZnJvbSAnLi9Qb3B1cFdpbmRvdyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwTmF2aWdhdG9yIHtcbiAgICBcbiAgICBwcmVwYXJlKHBhcmFtcykge1xuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgUG9wdXBXaW5kb3cocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb3B1cCk7XG4gICAgfVxuICAgIFxuICAgIGNhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwTmF2aWdhdG9yLmNhbGxiYWNrXCIpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBQb3B1cFdpbmRvdy5ub3RpZnlPcGVuZXIodXJsKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuY29uc3QgQ2hlY2tGb3JQb3B1cENsb3NlZEludGVydmFsID0gNTAwO1xuY29uc3QgRGVmYXVsdFBvcHVwRmVhdHVyZXMgPSAnbG9jYXRpb249bm8sdG9vbGJhcj1ubyx3aWR0aD01MDAsaGVpZ2h0PTUwMCxsZWZ0PTEwMCx0b3A9MTAwJztcbmNvbnN0IERlZmF1bHRQb3B1cFRhcmdldCA9IFwiX2JsYW5rXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwV2luZG93IHtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93LmN0b3JcIik7XG5cbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgZmVhdHVyZXMgPSBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCBEZWZhdWx0UG9wdXBGZWF0dXJlcztcbiAgICAgICAgbGV0IHRhcmdldCA9IHBhcmFtcy5wb3B1cFdpbmRvd1RhcmdldCB8fCBEZWZhdWx0UG9wdXBUYXJnZXQ7XG5cbiAgICAgICAgdGhpcy5fcG9wdXAgPSB3aW5kb3cub3BlbignJywgdGFyZ2V0LCBmZWF0dXJlcyk7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJwb3B1cCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCh0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkLmJpbmQodGhpcyksIENoZWNrRm9yUG9wdXBDbG9zZWRJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcbiAgICAgICAgTG9nLmluZm8oXCJQb3B1cFdpbmRvdy5uYXZpZ2F0ZVwiKTtcblxuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93XCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJTZXR0aW5nIFVSTCBpbiBwb3B1cFwiKTtcblxuICAgICAgICAgICAgdGhpcy5fcG9wdXAuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLndpbmRvdy5sb2NhdGlvbiA9IHBhcmFtcy51cmw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgIH1cblxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG5cbiAgICBfc3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuaW5mbyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBwb3B1cCB3aW5kb3dcIik7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XG4gICAgfVxuICAgIF9lcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgIH1cblxuICAgIF9jbGVhbnVwKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93Ll9jbGVhbnVwXCIpO1xuXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9jaGVja0ZvclBvcHVwQ2xvc2VkVGltZXIpO1xuXG4gICAgICAgIHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50c3NhZ2UgPSBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKXtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgIH1cblxuICAgIF9jaGVja0ZvclBvcHVwQ2xvc2VkKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93Ll9jaGVja0ZvclBvcHVwQ2xvc2VkXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXAgfHwgdGhpcy5fcG9wdXAuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIlBvcHVwIHdpbmRvdyBjbG9zZWRcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbWVzc2FnZShlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuX21lc3NhZ2VcIik7XG5cbiAgICAgICAgaWYgKGUub3JpZ2luID09PSB0aGlzLl9vcmlnaW4gJiZcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9wb3B1cC53aW5kb3dcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInByb2Nlc3NpbmcgbWVzc2FnZVwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHVybCA9IGUuZGF0YSB8fCBlLnNvdXJjZS5sb2NhdGlvbi5ocmVmOyAvLyBmb3IgSUU5XG5cbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIHBvcHVwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IF9vcmlnaW4oKSB7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vdGlmeU9wZW5lcih1cmwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJQb3B1cFdpbmRvdy5ub3RpZnlPcGVuZXJcIik7XG5cbiAgICAgICAgaWYgKHdpbmRvdy5vcGVuZXIpIHtcbiAgICAgICAgICAgIHVybCA9IHVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInBvc3RpbmcgdXJsIG1lc3NhZ2UgdG8gb3BlbmVyXCIpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIucG9zdE1lc3NhZ2UodXJsLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvUG9wdXBXaW5kb3cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBJRnJhbWVXaW5kb3cgZnJvbSAnLi9JRnJhbWVXaW5kb3cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJRnJhbWVOYXZpZ2F0b3Ige1xuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgbGV0IGZyYW1lID0gbmV3IElGcmFtZVdpbmRvdygpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayh1cmwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIElGcmFtZVdpbmRvdy5ub3RpZnlQYXJlbnQodXJsKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvSUZyYW1lTmF2aWdhdG9yLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmNvbnN0IERlZmF1bHRUaW1lb3V0ID0gNTAwMDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSUZyYW1lV2luZG93IHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBMb2cuaW5mbyhcIklGcmFtZVdpbmRvdy5jdG9yXCIpO1xuXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQgPSB0aGlzLl9tZXNzYWdlLmJpbmQodGhpcyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fZnJhbWUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgdGhpcy5fZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9mcmFtZSk7XG4gICAgfVxuXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Lm5hdmlnYXRlXCIpO1xuXG4gICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gd2luZG93LnNldFRpbWVvdXQodGhpcy5fdGltZW91dC5iaW5kKHRoaXMpLCBEZWZhdWx0VGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5zcmMgPSBwYXJhbXMudXJsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgIH1cblxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG5cbiAgICBfc3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuaW5mbyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBmcmFtZSB3aW5kb3dcIik7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZGF0YSk7XG4gICAgfVxuICAgIF9lcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3JlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgIH1cblxuICAgIF9jbGVhbnVwKCkge1xuICAgICAgICBMb2cuaW5mbyhcIklGcmFtZVdpbmRvdy5fY2xlYW51cFwiKTtcblxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuX2ZyYW1lKTtcblxuICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2ZyYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnRzc2FnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgX3RpbWVvdXQoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Ll90aW1lb3V0XCIpO1xuICAgICAgICB0aGlzLl9lcnJvcihcIkZyYW1lIHdpbmRvdyB0aW1lZCBvdXRcIik7XG4gICAgfVxuXG4gICAgX21lc3NhZ2UoZSkge1xuICAgICAgICBMb2cuaW5mbyhcIklGcmFtZVdpbmRvdy5fbWVzc2FnZVwiKTtcblxuICAgICAgICBpZiAodGhpcy5fdGltZXIgJiZcbiAgICAgICAgICAgIGUub3JpZ2luID09PSB0aGlzLl9vcmlnaW4gJiZcbiAgICAgICAgICAgIGUuc291cmNlID09PSB0aGlzLl9mcmFtZS5jb250ZW50V2luZG93XG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IHVybCA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWNjZXNzKHsgdXJsOiB1cmwgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihcIkludmFsaWQgcmVzcG9uc2UgZnJvbSBmcmFtZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBfb3JpZ2luKCkge1xuICAgICAgICByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xuICAgIH1cblxuICAgIHN0YXRpYyBub3RpZnlQYXJlbnQodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudFwiKTtcblxuICAgICAgICBpZiAod2luZG93LnBhcmVudCAmJiB3aW5kb3cgIT09IHdpbmRvdy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHVybCA9IHVybCB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInBvc3RpbmcgdXJsIG1lc3NhZ2UgdG8gcGFyZW50XCIpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UodXJsLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvSUZyYW1lV2luZG93LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXIge1xuICAgIGNvbnN0cnVjdG9yKHtpZF90b2tlbiwgc2Vzc2lvbl9zdGF0ZSwgYWNjZXNzX3Rva2VuLCB0b2tlbl90eXBlLCBzY29wZSwgcHJvZmlsZSwgZXhwaXJlc19hdCwgc3RhdGV9KSB7XG4gICAgICAgIHRoaXMuaWRfdG9rZW4gPSBpZF90b2tlbjtcbiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXRlID0gc2Vzc2lvbl9zdGF0ZTtcbiAgICAgICAgdGhpcy5hY2Nlc3NfdG9rZW4gPSBhY2Nlc3NfdG9rZW47XG4gICAgICAgIHRoaXMudG9rZW5fdHlwZSA9IHRva2VuX3R5cGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5wcm9maWxlID0gcHJvZmlsZTtcbiAgICAgICAgdGhpcy5leHBpcmVzX2F0ID0gZXhwaXJlc19hdDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cblxuICAgIGdldCBleHBpcmVzX2luKCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICBsZXQgbm93ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwaXJlc19hdCAtIG5vdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBleHBpcmVkKCkge1xuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHRoaXMuZXhwaXJlc19pbjtcbiAgICAgICAgaWYgKGV4cGlyZXNfaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGlyZXNfaW4gPD0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldCBzY29wZXMoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zY29wZSB8fCBcIlwiKS5zcGxpdChcIiBcIik7XG4gICAgfVxuXG4gICAgdG9TdG9yYWdlU3RyaW5nKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXIudG9TdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWRfdG9rZW46IHRoaXMuaWRfdG9rZW4sXG4gICAgICAgICAgICBzZXNzaW9uX3N0YXRlOiB0aGlzLnNlc3Npb25fc3RhdGUsXG4gICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgdG9rZW5fdHlwZTogdGhpcy50b2tlbl90eXBlLFxuICAgICAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG4gICAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgICBleHBpcmVzX2F0OiB0aGlzLmV4cGlyZXNfYXRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyLmZyb21TdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXIoSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKSk7XG4gICAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VzZXIuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBBY2Nlc3NUb2tlbkV2ZW50cyBmcm9tICcuL0FjY2Vzc1Rva2VuRXZlbnRzJztcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlck1hbmFnZXJFdmVudHMgZXh0ZW5kcyBBY2Nlc3NUb2tlbkV2ZW50cyB7XG5cbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3VzZXJMb2FkZWQgPSBuZXcgRXZlbnQoXCJVc2VyIGxvYWRlZFwiKTtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkID0gbmV3IEV2ZW50KFwiVXNlciB1bmxvYWRlZFwiKTtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvciA9IG5ldyBFdmVudChcIlNpbGVudCByZW5ldyBlcnJvclwiKTtcbiAgICB9XG5cbiAgICBsb2FkKHVzZXIpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlckV2ZW50cy5sb2FkXCIpO1xuICAgICAgICBzdXBlci5sb2FkKHVzZXIpO1xuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLnJhaXNlKHVzZXIpO1xuICAgIH1cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXJFdmVudHMudW5sb2FkXCIpO1xuICAgICAgICBzdXBlci51bmxvYWQoKTtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLnJhaXNlKCk7XG4gICAgfVxuXG4gICAgYWRkVXNlckxvYWRlZChjYikge1xuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVVc2VyTG9hZGVkKGNiKSB7XG4gICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxuICAgIFxuICAgIGFkZFVzZXJVbmxvYWRlZChjYikge1xuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQuYWRkSGFuZGxlcihjYik7XG4gICAgfVxuICAgIHJlbW92ZVVzZXJVbmxvYWRlZChjYikge1xuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxuXG4gICAgYWRkU2lsZW50UmVuZXdFcnJvcihjYikge1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVTaWxlbnRSZW5ld0Vycm9yKGNiKSB7XG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxuICAgIF9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyRXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3JcIiwgZS5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5yYWlzZShlKTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Vc2VyTWFuYWdlckV2ZW50cy5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vVGltZXInO1xuXG5jb25zdCBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSA2MDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjZXNzVG9rZW5FdmVudHMge1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IERlZmF1bHRBY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSxcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ1RpbWVyID0gbmV3IFRpbWVyKFwiQWNjZXNzIHRva2VuIGV4cGlyaW5nXCIpLFxuICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZWRUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmVkXCIpXG4gICAgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XG5cbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZyA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lcjtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkID0gYWNjZXNzVG9rZW5FeHBpcmVkVGltZXI7XG4gICAgfVxuXG4gICAgbG9hZChjb250YWluZXIpIHtcbiAgICAgICAgTG9nLmluZm8oXCJBY2Nlc3NUb2tlbkV2ZW50cy5sb2FkXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XG5cbiAgICAgICAgLy8gb25seSByZWdpc3RlciBldmVudHMgaWYgdGhlcmUncyBhbiBhY2Nlc3MgdG9rZW4gd2hlcmUgd2UgY2FyZSBhYm91dCBleHBpcmF0aW9uXG4gICAgICAgIGlmIChjb250YWluZXIuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBjb250YWluZXIuZXhwaXJlc19pbjtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiYWNjZXNzIHRva2VuIHByZXNlbnQsIHJlbWFpbmluZyBkdXJhdGlvbjpcIiwgZHVyYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoZHVyYXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gb25seSByZWdpc3RlciBleHBpcmluZyBpZiB3ZSBzdGlsbCBoYXZlIHRpbWVcbiAgICAgICAgICAgICAgICBsZXQgZXhwaXJpbmcgPSBkdXJhdGlvbiAtIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuICAgICAgICAgICAgICAgIGlmIChleHBpcmluZyA8PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJpbmcgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInJlZ2lzdGVyaW5nIGV4cGlyaW5nIHRpbWVyIGluOlwiLCBleHBpcmluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5pbml0KGV4cGlyaW5nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWx3YXlzIHJlZ2lzdGVyIGV4cGlyZWQuIGlmIGl0J3MgbmVnYXRpdmUsIGl0IHdpbGwgc3RpbGwgZmlyZVxuICAgICAgICAgICAgbGV0IGV4cGlyZWQgPSBkdXJhdGlvbiArIDE7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlZ2lzdGVyaW5nIGV4cGlyZWQgdGltZXIgaW46XCIsIGV4cGlyZWQpO1xuICAgICAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmluaXQoZXhwaXJlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmxvYWQoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiQWNjZXNzVG9rZW5FdmVudHMudW5sb2FkXCIpO1xuICAgICAgICB0aGlzLl9jYW5jZWxUaW1lcnMoKTtcbiAgICB9XG4gICAgXG4gICAgX2NhbmNlbFRpbWVycygpe1xuICAgICAgICBMb2cuaW5mbyhcImNhbmNlbGluZyBleGlzdGluZyBhY2Nlc3MgdG9rZW4gdGltZXJzXCIpO1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuY2FuY2VsKCk7XG4gICAgfVxuXG4gICAgYWRkQWNjZXNzVG9rZW5FeHBpcmluZyhjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVBY2Nlc3NUb2tlbkV4cGlyaW5nKGNiKSB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxuXG4gICAgYWRkQWNjZXNzVG9rZW5FeHBpcmVkKGNiKSB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmVkKGNiKSB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5yZW1vdmVIYW5kbGVyKGNiKTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cy5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuL0dsb2JhbCc7XG5pbXBvcnQgRXZlbnQgZnJvbSAnLi9FdmVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVyIGV4dGVuZHMgRXZlbnQge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdGltZXIgPSBHbG9iYWwudGltZXIpIHtcbiAgICAgICAgc3VwZXIobmFtZSk7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gdGltZXI7XG4gICAgfVxuXG4gICAgaW5pdChkdXJhdGlvbikge1xuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbiA8PSAwKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IHRoaXMuX3RpbWVyLnNldFRpbWVvdXQodGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSwgZHVyYXRpb24gKiAxMDAwKTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aW1lckhhbmRsZSkge1xuICAgICAgICAgICAgdGhpcy5fdGltZXIuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5fdGltZXJIYW5kbGUgPSBudWxsO1xuICAgICAgICBzdXBlci5yYWlzZSgpO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1RpbWVyLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgIH1cblxuICAgIGFkZEhhbmRsZXIoY2IpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgIH1cblxuICAgIHJlbW92ZUhhbmRsZXIoY2IpIHtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2NhbGxiYWNrcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBjYik7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmFpc2UoLi4ucGFyYW1zKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUmFpc2luZyBldmVudDogXCIgKyB0aGlzLl9uYW1lKTtcbiAgICAgICAgZm9yICh2YXIgY2Igb2YgdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYiguLi5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvRXZlbnQuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lsZW50UmVuZXdTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVzZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyID0gdXNlck1hbmFnZXI7XG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLmV2ZW50cy5hZGRBY2Nlc3NUb2tlbkV4cGlyaW5nKHRoaXMuX3Rva2VuRXhwaXJpbmcuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIFxuICAgIF90b2tlbkV4cGlyaW5nKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlNpbGVudFJlbmV3U2VydmljZSBhdXRvbWF0aWNhbGx5IHJlbmV3aW5nIGFjY2VzcyB0b2tlblwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIlNpbGVudCB0b2tlbiByZW5ld2FsIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIHNpZ25pblNpbGVudDpcIiwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvU2lsZW50UmVuZXdTZXJ2aWNlLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==